Materializar CSS - Selecionar não parece renderizar

120

Atualmente, estou trabalhando com materializar CSS e parece que fiquei preso nos campos selecionados.

Estou usando o exemplo fornecido pelo site deles, mas infelizmente está renderizando na visualização de qualquer maneira. Fiquei me perguntando se mais alguém poderia ajudar.

O que estou tentando fazer é criar uma linha com 2 espaçadores finais que forneçam preenchimento - então, nos itens de duas linhas internas, deve haver uma entrada de texto de pesquisa e uma lista suspensa de seleção de pesquisa.

Este é o exemplo com o qual estou trabalhando: http://materializecss.com/forms.html

Agradeço antecipadamente.

Aqui está o trecho de código em questão.

<div class="row">
<form class="col s12">
    <div class="row">
        <div class="input-field col s2"></div>
        <div class="input-field col s5">
            <input id="icon_prefix" type="text" class="validate" />
            <label for="icon_prefix">Search</label>
        </div>
        <div class="input-field col s3">
            <label>Materialize Select</label>
            <select>
                <option value="" disabled="disabled" selected="selected">Choose your option</option>
                <option value="1">Option 1</option>
                <option value="2">Option 2</option>
                <option value="3">Option 3</option>
            </select>
        </div>
        <div class="input-field col s2"></div>
    </div>
</form>

Ryan Rentfro
fonte

Respostas:

247

Como eles substituem o padrão do navegador, o estilo de seleção precisa de Javascript para ser executado. Você precisa incluir o arquivo Materialize Javascript e, em seguida, chamar

$(document).ready(function() {
    $('select').material_select();
});

depois de carregar esse arquivo.

jameslittle230
fonte
21
Caso contrário, você pode usar o navegador padrão e não é necessária a inicialização:<select class="browser-default">
Shwaydogg
8
O changelog mais recente diz o seguinte:Rename plugin call .material_select() to .formSelect()
ss2025
Não escreva em $ (document) .ready (function () {caso contrário, não funcionará
HN Singh
Nossa! Estou batendo minha cabeça contra uma parede de tijolos por horas tentando descobrir isso ... Obrigado ....
Clyde
50

O design de selectfuncionalidade em materializar CSS é, na minha opinião, um bom motivo para não usá-lo.

Você tem que inicializar o elemento select com material_select(), como @ littleguy23 menciona. Caso contrário, a caixa de seleção nem mesmo será exibida! Em um aplicativo jQuery antigo, posso inicializá-lo na função de documento pronto. Adivinhe, nem eu nem muitas outras pessoas estão usando jQuery atualmente, nem inicializamos nossos aplicativos no gancho pronto para documentos.

Seleções criadas dinamicamente . E se eu estiver criando seleções dinamicamente, como acontece em uma estrutura como o Ember, que gera visualizações instantaneamente? Eu tenho que adicionar lógica em cada visão para inicializar a caixa de seleção toda vez que uma visão é gerada, ou escrever um mixin de visão para lidar com isso para mim. E é pior do que isso: quando a visualização é gerada, e em termos de Ember didInsertElementé chamada, a ligação com a lista de opções para a caixa de seleção pode não ter sido resolvida ainda, então eu preciso de uma lógica especial observando a lista de opções para esperar até que seja preenchido antes de fazer a chamada para o material_select. Se as opções mudarem, como poderiam facilmente, material_selectnão tem ideia sobre isso e não atualiza o menu suspenso. Posso ligar material_selectnovamente quando as opções mudam, mas parece que isso não faz nada (é ignorado).

Em outras palavras, parece que a suposição de design por trás de materializar as caixas de seleção do CSS é que todas elas estão lá no carregamento da página e seus valores nunca mudam.

Implementação . Do ponto de vista estético, também não sou a favor da maneira como o CSS implementa seus dropdowns, que é criar um conjunto paralelo de elementos de sombra em algum outro lugar do DOM. Concedido, alternativas como select2 fazem a mesma coisa, e pode não haver outra maneira de obter alguns dos efeitos visuais (sério?). Para mim, porém, quando inspeciono um elemento, quero ver o elemento, não alguma versão de sombra em algum outro lugar que alguém criou magicamente.

Quando o Ember destrói a visualização, não tenho certeza se o CSS materializar destrói os elementos de sombra que ele criou. Na verdade, eu ficaria muito surpreso se isso acontecesse. Se minha teoria estiver correta, conforme as visualizações são geradas e destruídas, seu DOM vai acabar ficando poluído com dezenas de conjuntos de dropdowns de sombra não conectados a nada. Isso se aplica não apenas ao Ember, mas a qualquer outra estrutura de front-end OPA baseada em MVC / template.

Ligações . Eu também não consegui descobrir como obter o valor selecionado na caixa de diálogo para vincular de volta a qualquer coisa útil em uma estrutura como o Ember, que invoca caixas de seleção por meio de uma {{view 'Ember.Select' value=country}}interface de tipo. Em outras palavras, quando algo é selecionado, countrynão é atualizado. Este é um quebra-negócio.

Waves . A propósito, os mesmos problemas se aplicam ao efeito de "onda" nos botões. Você deve inicializá-lo sempre que um botão for criado. Eu, pessoalmente, não me importo com o efeito das ondas e não entendo o porquê de tanto barulho, mas se você quiser ondas, esteja ciente de que passará boa parte do resto da sua vida se preocupando em como inicializar cada botão quando ele for criado.

Agradeço o esforço feito pelos caras do CSS para materializar, e há alguns efeitos visuais legais lá, mas é muito grande e tem muitos truques como os acima para ser algo que eu usaria. Agora estou planejando extrair materializar CSS do meu aplicativo e voltar para o Bootstrap ou uma camada em cima do CSS do Suit. Suas ferramentas devem tornar sua vida mais fácil, não mais difícil.


fonte
3
Obrigado pela extensa resposta. É muito informativo e concordo com muitos dos sentimentos que você expressou. Eu realmente gosto de materializar CSS e suas abordagens com muitas coisas. Eu entendo exatamente o que você está dizendo e tenho pensado muito sobre todos os 'efeitos' que os aplicativos modernos exigem. Não tenho certeza se esses tipos de projetos e conceitos se encaixam em software de grande escala ainda. Eu com certeza gosto da aparência e dos conceitos. Obrigado novamente.
Ryan Rentfro
Ótima resposta. Encontrando problemas com SELECT com Materialize também, como eventos de clique na barra de rolagem descartando a lista de OPÇÕES. @torazaburo Com o que você acabou indo? Voltar para o Bootstrap?
Sean O,
@SeanO por enquanto, sim.
Gastei tempo suficiente convertendo a maioria das minhas páginas da web e formulários para materializar, mas agora estou tentando resolver o problema selecionado. É muito ruim, o materializecss tem um tráfego enorme, mas ainda não resolveu esse pequeno problema. Se você está avaliando o uso para algum produto de consumo, espere até que amadureça
Asif Shahzad
9
Você pode usar <select class="browser-default">e NÃO precisará inicializar com js e terá a IU nativa com a qual o usuário está acostumado. A inicialização de JS será necessária para qualquer implementação que não use a IU nativa.
Shwaydogg
9

@ littleguy23 Correto, mas você não quer fazer isso para seleção múltipla. Portanto, apenas uma pequena mudança no código:

$(document).ready(function() {
    // Select - Single
    $('select:not([multiple])').material_select();
});
DFlores009
fonte
2
Por quê? Se excluirmos vários campos selecionados, eles não funcionarão.
Desprit
6

Isso funcionou para mim, sem jquery ou select wrapper com classe de entrada, apenas material.js e este vanilla js:

document.addEventListener('DOMContentLoaded', function() {
    var elems = document.querySelectorAll('select');
    var instances = M.FormSelect.init(elems);
});

insira a descrição da imagem aqui insira a descrição da imagem aqui

Como você pode ver, eu tenho o estilo real materialize css e não o padrão do navegador.

Lomelisan
fonte
5

Isso também funciona: class = "browser-default"

Abel
fonte
3

Se estiver usando Angularjs, você pode usar o plugin angular-materialize , que fornece algumas diretivas úteis. Então você não precisa inicializar no js, ​​apenas adicione material-selectao seu select:

<div input-field>
    <select class="" ng-model="select.value1" material-select>
        <option ng-repeat="value in select.choices">{{value}}</option>
    </select>
</div>
Artemis_134
fonte
3

A solução que funcionou para mim é chamar a função 'material_select' depois que os dados de opções foram carregados. Se você imprimir o valor de OptionsList.find (). Count () no console, primeiro é 0 e, em seguida, alguns milissegundos depois, a lista é preenchida com dados.

Template.[name].rendered = function() {
    this.autorun(function() {
        var optionsCursor = OptionsList.find().count();
        if(optionsCursor > 0)
        {
            $('select').material_select();
        }
    });
};
Brandiqa
fonte
1
Bom encontrar Brandiqa! Eu tinha chamado $('select').material_select();de AppComponent.ngOnInit(), mas você precisa chamá-lo depois que o <select/>html for renderizado, o que fiz em dropdown.component.ts. A correção foi chamá-lo de ngOnInit()qualquer componente que use os menus suspensos.
Levi Fuller de
2

Para mim, nenhuma das outras respostas funcionou porque estou usando a versão mais recente de MaterializeCSS e Meteor e há incompatibilidade entre as versões do jquery, o Meteor 1.1.10 usa jquery 1.11 (substituir essa dependência não é fácil e provavelmente quebrará o Meteor / Blaze) e testar o Materialize com jquery 2.2 funciona bem. Consulte https://stackoverflow.com/a/34809976/2882279 para obter mais informações.

Este é um problema conhecido com menus suspensos e seleções em materializar 0.97.2 e 0.97.3; para obter mais informações, consulte https://github.com/Dogfalo/materialize/issues/2265 e https://github.com/Dogfalo/materialize/commit/45feae64410252fe51e56816e664c09d83dc8931 .

Estou usando a versão Sass de MaterializeCSS no Meteor e contornei o problema usando poetic: [email protected] em meu arquivo de pacotes de meteoros para forçar a versão antiga. Os menus suspensos agora funcionam, com o velho jquery e tudo!

Mozfet
fonte
1

Chame o código materialize css jquery somente depois que o html for renderizado. Portanto, você pode ter um controlador e, em seguida, disparar um serviço que chama o código jquery no controlador. Isso deixará o botão de seleção correto. No entanto, se você tentar usar ngChange ou ngSubmit, pode não funcionar devido ao estilo dinâmico da tag de seleção.

Nitish Phanse
fonte
1

Só isso funcionou para mim:

$(document).ready(function(){
    $('select').not('.disabled').formSelect();
});
Igor Shumichenko
fonte
0

Eu me vi em uma situação em que usar a solução selecionada

$(document).ready(function() {
$('select').material_select();
}); 

por alguma razão estava jogando erros porque a função material_select () não pôde ser encontrada. Não foi possível apenas dizer <select class="browser-default... Porque eu estava usando um framework que renderizou automaticamente os formulários. Então, minha solução foi adicionar a classe usando js (Jquery)

<script>
 $(document).ready(function() {
   $('select').attr("class", "browser-default")
});

me desbloquear
fonte
0

Primeiro, certifique-se de inicializá-lo em document.pronto:

$(document).ready(function () {
    $('select').material_select();
});

Em seguida, preencha-o com seus dados da maneira que desejar. Meu exemplo:

    function FillMySelect(myCustomData) {
       $("#mySelect").html('');

        $.each(myCustomData, function (key, value) {
           $("#mySelect").append("<option value='" + value.id+ "'>" + value.name + "</option>");
        });
}

Após terminar com a população, certifique-se de acionar este contentChanged assim:

$("#mySelect").trigger('contentChanged');
Alejandro Bastidas
fonte
0

Para o navegador padrão,

<head>
     select {
            display: inline !important;
         }
</head>

Ou a solução Jquery após o link para a biblioteca Jquery e seus arquivos local / CDN materializar

<script>
(function($){
  $(function(){
    // Plugin initialization
    $('select').not('.disabled').formSelect();
  }); 
})(jQuery); // end of jQuery name space

Eu realmente gosto deste framework, mas o que diabos ter display: nenhum ...

user2060451
fonte
-5

Apenas para acompanhar isso, já que a resposta principal recomenda não usar materializecss ... na versão atual do materialize você não precisa mais inicializar selects.

user2386854
fonte
9
Estou usando a versão 0.95.3 e ainda tenho que inicializar os selects. Estou fazendo algo errado?
Uriel Hernández
3
Você ainda precisa inicializar (não padrão do navegador) SELECTs na v0.96.1.
Sean O,
4
Downvote: eles estão na v0.97.1 e você ainda precisa inicializar as seleções com javascript.
Pablo Fernandez
0.100.2: as seleções precisam ser inicializadas. Não há evidências de que essa resposta tenha sido correta.
JJJ