Materializza CSS: selezionare non sembra renderizzare


120

Attualmente sto lavorando con materialize CSS e sembra che mi sono impigliato con i campi selezionati.

Sto usando l'esempio fornito dal loro sito, ma sfortunatamente viene visualizzato nella visualizzazione. Mi chiedevo se qualcun altro potrebbe essere in grado di aiutare.

Quello che sto cercando di fare è creare una riga con 2 distanziatori finali che forniscono riempimento, quindi all'interno dei due elementi di riga interni dovrebbero esserci un input di testo di ricerca e un menu a discesa di selezione della ricerca.

Questo è l'esempio da cui sto lavorando: http://materializecss.com/forms.html

Grazie in anticipo.

Ecco lo snippet di codice in questione.

<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>

Risposte:


247

Poiché sovrascrivono l'impostazione predefinita del browser, lo stile di selezione richiede l'esecuzione di Javascript. È necessario includere il file Materialise Javascript e quindi chiamare

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

dopo aver caricato quel file.


21
Altrimenti puoi usare il browser predefinito e non è richiesta l'inizializzazione:<select class="browser-default">
Shwaydogg

8
L'ultimo Rename plugin call .material_select() to .formSelect()
log delle modifiche

Non scrivere questo in $ (document) .ready (function () {altrimenti non funzionerà
HN Singh

Sheesh! Ho sbattuto la testa contro un muro di mattoni per ore cercando di capirlo ... Grazie ....
Clyde

50

Il design di select funzionalità in Materialise CSS è, a mio parere, una buona ragione per non usarlo.

Devi inizializzare l'elemento select con material_select() , come menzionato da @ littleguy23. In caso contrario, la casella di selezione non viene nemmeno visualizzata! In un'app jQuery vecchio stile, posso inizializzarla nella funzione document ready. Indovina un po ', né io né molte altre persone usiamo jQuery in questi giorni, né inizializziamo le nostre app nell'hook document ready.

Selezioni create dinamicamente . E se creo selezioni dinamicamente, come accade in un framework come Ember che genera visualizzazioni al volo? Devo aggiungere la logica in ogni vista per inizializzare la casella di selezione ogni volta che viene generata una vista, o scrivere un mixin di vista per gestirlo per me. Ed è peggio di così: quando la vista viene generata, e in termini di Ember didInsertElementviene chiamata, l'associazione all'elenco delle opzioni per la casella di selezione potrebbe non essere stata ancora risolta, quindi ho bisogno di una logica speciale che osservi l'elenco delle opzioni per aspettare finché non è popolato prima di effettuare la chiamata al material_select. Se le opzioni cambiano, come potrebbero facilmente, material_selectnon ne ha idea e non aggiorna il menu a discesa. Posso chiamarematerial_select nuovo quando le opzioni cambiano, ma sembra che ciò non faccia nulla (viene ignorato).

In altre parole, sembra che l'ipotesi progettuale dietro le caselle di selezione di materialize CSS sia che siano tutte presenti al caricamento della pagina e che i loro valori non cambino mai.

Implementazione . Da un punto di vista estetico, inoltre, non sono favorevole al modo in cui materializzare CSS implementa i suoi menu a discesa, che consiste nel creare un insieme ombra parallelo di elementi da qualche altra parte nel DOM. Certo, alternative come select2 fanno la stessa cosa e potrebbe non esserci altro modo per ottenere alcuni degli effetti visivi (davvero?). Per me, però, quando ispeziono un elemento, voglio vedere l'elemento, non una versione ombra da qualche altra parte che qualcuno ha creato magicamente.

Quando Ember abbatte la vista, non sono sicuro che materializzare CSS abbatti gli elementi ombra che ha creato. In realtà, sarei piuttosto sorpreso se lo facesse. Se la mia teoria è corretta, man mano che le visualizzazioni vengono generate e abbattute, il tuo DOM finirà per essere inquinato da dozzine di set di menu a discesa ombra non collegati a nulla. Ciò si applica non solo a Ember ma a qualsiasi altro framework front-end OPA basato su MVC / template.

Binding . Inoltre, non sono stato in grado di capire come ottenere il valore selezionato nella finestra di dialogo per collegarmi a qualcosa di utile in un framework come Ember che richiama le caselle di selezione tramite un'interfaccia di {{view 'Ember.Select' value=country}}tipo. In altre parole, quando qualcosa è selezionato, countrynon viene aggiornato. Questo è un rompicapo.

Onde . A proposito, gli stessi problemi si applicano all'effetto "onda" sui pulsanti. Devi inizializzarlo ogni volta che viene creato un pulsante. Personalmente non mi interessa l'effetto onda e non capisco di cosa si tratta, ma se vuoi le onde, sii consapevole che trascorrerai buona parte del resto della tua vita a preoccuparti di come farlo inizializza ogni singolo pulsante quando viene creato.

Apprezzo lo sforzo fatto dai ragazzi di materializzare CSS, e ci sono alcuni bei effetti visivi lì, ma è troppo grande e ha troppi trucchi come quello sopra per essere qualcosa che userei. Ora sto pianificando di estrarre materializzare CSS dalla mia app e tornare a Bootstrap o un livello sopra Suit CSS. I tuoi strumenti dovrebbero semplificarti la vita, non più difficile.


3
Grazie per l'ampia risposta. È molto istruttivo e concordo con molti dei sentimenti che hai espresso. Mi piace molto materializzare i CSS ei loro approcci con molte cose. Capisco esattamente quello che stai dicendo e ho pensato molto a tutti gli "effetti" richiesti dalle moderne app. Non sono ancora sicuro che quei tipi di design e concetti si adattino al software su larga scala. Di sicuro mi piacciono l'aspetto e i concetti però. Grazie ancora.
Ryan Rentfro

Ottima risposta. Incontrare problemi con SELEZIONA anche con Materialise, come eventi di clic sulla barra di scorrimento che chiudono l'elenco delle OPZIONI. @torazaburo Con cosa sei finito? Torna a Bootstrap?
Sean O

@SeanO per ora, sì.

Ho passato abbastanza tempo a convertire la maggior parte delle mie pagine Web e moduli per materializzarmi, ma ora mi sono bloccato su come risolvere il problema selezionato. È davvero brutto, il materializecss ha un traffico enorme ma ancora non risolve questo problema minore. Se stai valutando di usarlo per alcuni prodotti di consumo, attendi che maturi
Asif Shahzad

9
Puoi usare <select class="browser-default">e NON dovrai inizializzare con js e avrai l'interfaccia utente nativa a cui l'utente è abituato. L'inizializzazione di JS sarà richiesta per qualsiasi implementazione che non utilizzi l'interfaccia utente nativa.
Shwaydogg,

9

@ littleguy23 È corretto, ma non vuoi farlo per la selezione multipla. Quindi solo una piccola modifica al codice:

$(document).ready(function() {
    // Select - Single
    $('select:not([multiple])').material_select();
});

2
Perché? Se escludiamo più campi di selezione, non funzioneranno.
Desprit

6

Questo ha funzionato per me, nessun jquery o select wrapper con classe di input, solo material.js e questo js vanilla:

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

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Come puoi vedere, ho ottenuto lo stile effettivo CSS materialize e non quello predefinito del browser.


5

Funziona anche questo: class = "browser-default"


3

Se stai usando Angularjs, puoi usare il plug-in angular -materialize , che fornisce alcune utili direttive. Quindi non è necessario inizializzare in js, basta aggiungere material-selectalla selezione:

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

3

La soluzione che ha funzionato per me è chiamare la funzione "material_select" dopo che i dati delle opzioni sono stati caricati. Se si stampa il valore di OptionsList.find (). Count () sulla console è prima 0 poi pochi millisecondi dopo l'elenco viene popolato di dati.

Template.[name].rendered = function() {
    this.autorun(function() {
        var optionsCursor = OptionsList.find().count();
        if(optionsCursor > 0)
        {
            $('select').material_select();
        }
    });
};

1
Bella scoperta Brandiqa! Avevo chiamato $('select').material_select();da AppComponent.ngOnInit(), ma devi chiamarlo dopo che l' <select/>html è stato reso, cosa che ho fatto in dropdown.component.ts. La correzione consisteva nel richiamarlo ngOnInit()dall'interno di qualsiasi componente utilizzi i menu a discesa.
Levi Fuller,

2

Per me nessuna delle altre risposte ha funzionato perché sto usando l'ultima versione di MaterializeCSS e Meteor e c'è incompatibilità tra le versioni di jquery, Meteor 1.1.10 usa jquery 1.11 (ignorare questa dipendenza non è facile e probabilmente interromperà Meteor / Blaze) e testare Materialise con jquery 2.2 funziona bene. Vedi https://stackoverflow.com/a/34809976/2882279 per maggiori informazioni.

Questo è un problema noto con i menu a discesa e seleziona in materialize 0.97.2 e 0.97.3; per maggiori informazioni vedere https://github.com/Dogfalo/materialize/issues/2265 e https://github.com/Dogfalo/materialize/commit/45feae64410252fe51e56816e664c09d83dc8931 .

Sto usando la versione Sass di MaterializeCSS in Meteor e ho risolto il problema usando poetic: materialize-scss@1.97.1 nel mio file dei pacchetti meteor per forzare la vecchia versione. I menu a discesa ora funzionano, vecchio jquery e tutto!


1

Chiama il codice jquery css materialize solo dopo che html ha eseguito il rendering. Quindi puoi avere un controller e quindi attivare un servizio che chiama il codice jquery nel controller. Questo renderà il pulsante di selezione corretto. Tuttavia, se provi a utilizzare ngChange o ngSubmit, potrebbe non funzionare a causa dello stile dinamico del tag select.


1

Solo questo ha funzionato per me:

$(document).ready(function(){
    $('select').not('.disabled').formSelect();
});

0

Mi sono trovato in una situazione in cui utilizzare la soluzione selezionata

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

per qualsiasi motivo stava generando errori perché non è stato possibile trovare la funzione material_select (). Non è stato possibile dire solo <select class="browser-default... perché stavo usando un framework che rendeva automaticamente i moduli. Quindi la mia soluzione era aggiungere la classe usando js (Jquery)

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


0

Innanzitutto, assicurati di inizializzarlo in document.ready in questo modo:

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

Quindi, popolalo con i tuoi dati nel modo desiderato. Il mio esempio:

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

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

Assicurati, dopo aver finito con la popolazione, di attivare questo contenuto modificato in questo modo:

$("#mySelect").trigger('contentChanged');

0

Per il browser predefinito,

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

Oppure la soluzione Jquery dopo il collegamento alla libreria Jquery e ai file di materializzazione locali / CDN

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

Mi piace molto questo framework, ma cosa diavolo ho da mostrare: nessuno ...


-5

Solo per approfondire questo dato che la risposta principale consiglia di non utilizzare materializecss ... nella versione corrente di materialize non è più necessario inizializzare le selezioni.


9
Sto usando la versione 0.95.3 e devo ancora inizializzare le selezioni. Sto facendo qualcosa di sbagliato?
Uriel Hernández

3
È ancora necessario inizializzare le SELECT (non predefinite del browser) nella v0.96.1.
Sean O

4
Downvote: sono in v0.97.1 e devi ancora inizializzare le selezioni con javascript.
Pablo Fernandez

0.100.2: le selezioni devono essere inizializzate. Non ci sono prove che questa risposta sia mai stata corretta.
JJJ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.