Как динамически изменять в materialize CSS framework
Я только начал использовать фреймворк materialize css. Теперь materialize преобразует любой тег select в набор элементов ul и li. Раньше, используя JQuery, я мог сделать это:
var $selectDropdown = $("#dropdownid");
$selectDropdown.empty();
$selectDropdown.html(' ');
var value = "some value";
$selectDropdown .append($("<option></option>").attr("value",value).text(value));
Мой html-это просто пример тега select:
Раньше это работало. Теперь это не удается. Какова была бы Альтернатива для динамического заполнения этого выпадающего списка с помощью javascript?
7 ответов:
Согласно документам по материализации форм :
Таким образом, лучший способ-это просто повторно связать сгенерированный select с дополнительным вызовомКроме того, вам потребуется отдельный вызов для любого динамически генерируемого элемента select, генерируемого вашей страницей
.material_select().Для повторного использования вы можете настроить прослушиватель , когда элементы изменились , а затем запускать этот прослушиватель всякий раз, когда вы обновляете оригинал выберите
// 1) setup listener for custom event to re-initialize on change $('select').on('contentChanged', function() { $(this).material_select(); }); // 2a) Whenever you do this --> add new option $selectDropdown.append($("<option></option>")); // 2b) Manually do this --> trigger custom event $selectDropdown.trigger('contentChanged');Это имеет то преимущество, что требуется только обновить конкретный элемент select, который изменился.
В jsFiddle & фрагментов стека:
$(function() { // initialize $('.materialSelect').material_select(); // setup listener for custom event to re-initialize on change $('.materialSelect').on('contentChanged', function() { $(this).material_select(); }); // update function for demo purposes $("#myButton").click(function() { // add new value var newValue = getNewDoggo(); var $newOpt = $("<option>").attr("value",newValue).text(newValue) $("#myDropdown").append($newOpt); // fire custom event anytime you've updated select $("#myDropdown").trigger('contentChanged'); }); }); function getNewDoggo() { var adjs = ['Floofy','Big','Cute','Cuddly','Lazy']; var nouns = ['Doggo','Floofer','Pupper','Fluffer', 'Nugget']; var newOptValue = adjs[Math.floor(Math.random() * adjs.length)] + " " + nouns[Math.floor(Math.random() * nouns.length)]; return newOptValue; }body { padding: 25px}<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.96.1/css/materialize.min.css" rel="stylesheet"> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.96.1/js/materialize.min.js"></script> <button class="waves-effect waves-light btn" id="myButton"> Add New Option to Dropdown </button> <select id="myDropdown" class="materialSelect"> <option value="Happy Floof">Happy Floof</option> <option value="Derpy Biscuit">Derpy Biscuit</option> </select>
Вы можете повторно инициализировать элемент select после успешной привязки данных. Вот так,
$('select').material_select();Аналогично этому:
var next_id = $(".mtr-select"); $.each(json, function(key, value) { $(next_id).append($("<option></option>").attr("value", value.id).text(value.name)); }); $(next_id).material_select();Он связывает свои значения параметров с новым элементом
ul>li, создавая объект dom при загрузке.
Является допустимым решением для MaterializeCss версии v0.96.1. В версии 0.97.0 это не работает: кажется, что есть ошибка, которая добавляет каре в HTML.
Здесь код для v0. 97. 0:
$(document).ready(function() { // Initialize $('select').material_select(); $("button").click(function() { // Clear the content $("select").empty().html(' '); // And add a new value var value = "New value"; $("select").append( $("<option></option>").attr("value",value).text(value) ); // Update the content clearing the caret $("select").material_select('update'); $("select").closest('.input-field').children('span.caret').remove(); }); });<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.0/css/materialize.min.css" rel="stylesheet"> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.0/js/materialize.min.js"></script> <button class="btn-large blue waves-effect waves-light">Change</button> <div class="input-field"> <select> <option>Option 1</option> <option>Option 2</option> <option>Option 3</option> </select> </div>
Это работает для материализовать 1.0.0-rc.1 :
Ситуация: У меня есть два поля; сначала нужно выбрать категорию
<select name="category" id="category"> <option value="0">Choisissez une Catégorie</option> <option value="1">Audios</option> <option value="2">Vidéos</option> <option value="3">Applications</option> <option value="4">Jeux Vidéos</option> </select>После выбора категории второй select id= "subcategory" заполняется хорошими субкатегориями в соответствии с родительской категорией:
<select name="subcategory" id="subcategory" disabled="disabled"> <option value="0">Choisissez une sous-catégorie</option> </select> var subCategoriesNames = ['Tout', ['Tout', 'Musiques', 'Concerts', 'Comédies'], ['Tout', 'Films', 'Séries TV', 'Emissions TV', 'Documentaires', 'Animations', 'Animations Séries', 'Concerts', 'Sports'], ['Tout', 'Livres', 'Magazines', 'Presses', 'Mangas', 'BD'], ['Tout', 'Formations', 'Android', 'Windows', 'Linux', 'Web', 'Emulateurs'], ['Tout', 'Android', 'Windows', 'Consoles', 'Linux']], subCategoriesIds = ['1', ['2', '3', '4', '5'], ['6', '7', '8', '9', '10', '11', '12', '13', '14'], ['15', '16', '17', '18', '19', '20'], ['21', '22', '23', '24', '25', '26', '27'], ['28', '29', '30', '31', '32']], idx = 0, subsName; $(document).ready(function(){ $('#category').on('change', function(){ idx = this.selectedIndex; if(idx > 0){ $('select#subcategory').attr('disabled', false); for(subsName in subCategoriesNames[idx]) $('select#subcategory').append('<option value="'+subCategoriesIds[idx][subsName]+'">'+subCategoriesNames[idx][subsName]+'</option>'); }else{ $('select#subcategory').attr('disabled', true); } var subcatSelectElem = document.querySelectorAll('#subcategory'); var subcatSelectElem = M.FormSelect.init(subcatSelectElem, {}); }) });
$('select').material_select(); // for initializing the material select box $("select").closest('.input-field').children('.select-wrapper').children("span").html("");
$(document).ready(function() { // initialize $('select').material_select(); $("#myButton").click(function() { // clear contents var $selectDropdown = $("#dropdownid") .empty() .html(' '); // add new value var value = "some value"; $selectDropdown.append( $("<option></option>") .attr("value",value) .text(value) ); // trigger event $selectDropdown.trigger('contentChanged'); }); $('select').on('contentChanged', function() { // re-initialize (update) $(this).material_select(); }); });<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.96.1/css/materialize.min.css" rel="stylesheet"> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.96.1/js/materialize.min.js"></script> <a class="waves-effect waves-light btn" id="myButton"> Change Dropdown </a> <select id="dropdownid" > <option>Option 1</option> <option>Option 2</option> <option>Option 3</option> </select>
$(document).ready(function() { // initialize $('select').material_select(); $("#myButton").click(function() { // clear contents var $selectDropdown = $("#dropdownid") .empty() .html(' '); // add new value var value = "some value"; $selectDropdown.append( $("<option></option>") .attr("value",value) .text(value) ); // trigger event $selectDropdown.trigger('contentChanged'); }); $('select').on('contentChanged', function() { // re-initialize (update) $(this).material_select(); }); }); <link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.96.1 /css/materialize.min.css" rel="stylesheet"> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3 /jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.96.1/js/materialize.min.js"></script> <a class="waves-effect waves-light btn" id="myButton"> Change Dropdown </a> <select id="dropdownid" > <option>Option 1</option> <option>Option 2</option> <option>Option 3</option> </select>
Comments