Материализовать CSS - выберите, чтобы не отображать
В настоящее время я работаю над материализацией CSS, и кажется, что я получил привязку к полям выбора.
Я использую пример, предоставленный со своего сайта, но, к сожалению, он визуализируется в представлении. Мне было интересно, сможет ли кто-то другой помочь.
То, что я пытаюсь сделать, это создать строку с двумя концевыми прокладками, которые обеспечивают заполнение - тогда внутри внутренних двух элементов строки должен быть введен поиск текста и выпадающее меню выбора.
Вот пример, над которым я работаю: http://materializecss.com/forms.html
Спасибо заранее.
Вот фрагмент кода, о котором идет речь.
<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>
Ответы
Ответ 1
Поскольку они переопределяют браузер по умолчанию, для выбора стиля требуется запуск Javascript. Вам нужно включить файл Materialize Javascript, а затем вызвать
$(document).ready(function() {
$('select').material_select();
});
после того, как вы загрузили этот файл.
Ответ 2
Дизайн функциональности select
для материализации CSS - это, на мой взгляд, довольно веская причина не использовать его.
Вы должны инициализировать элемент select с помощью material_select()
, как упоминает @littleguy23. Если вы этого не сделаете, поле выбора даже не отображается! В старомодном приложении jQuery я могу инициализировать его в функции готовности документа. Угадайте, что ни я, ни многие другие люди не используют jQuery в наши дни, и мы не инициализируем наши приложения в готовом к работе документе.
Динамически созданный выбор. Что делать, если я создаю выбор динамически, например, происходит в рамках, например, Ember, который генерирует представления "на лету"? Я должен добавить логику в каждом представлении, чтобы инициализировать поле выбора каждый раз, когда создается представление, или написать представление mixin для обработки этого для меня. И это хуже того: когда создается представление, а в выражениях Ember выражается didInsertElement
, привязка к списку параметров для поля выбора может еще не разрешиться, поэтому мне нужна специальная логика, наблюдающая список опций, чтобы подождите, пока он не заселен, прежде чем делать вызов material_select
. Если параметры меняются, как легко могут, material_select
не имеет понятия об этом и не обновляет выпадающий список. Я могу вызвать material_select
снова, когда параметры меняются, но кажется, что это ничего не делает (игнорируется).
Другими словами, кажется, что предположение о дизайне за материализующими блоками выбора CSS заключается в том, что они все находятся там при загрузке страницы, и их значения никогда не меняются.
Реализация. С эстетической точки зрения, я также не сторонник того, как материализует CSS реализует свои выпадающие списки, а это создает параллельный теневой набор элементов где-то еще в DOM. Конечно, альтернативы, такие как select2, делают одно и то же, и не может быть другого способа добиться некоторых визуальных эффектов (на самом деле?). Для меня, однако, когда я проверяю элемент, я хочу видеть элемент, а не какую-то теневую версию где-то еще, что кто-то волшебным образом создал.
Когда Ember срывает представление, я не уверен, что материализует CSS, срывает созданные теневые элементы. На самом деле, я был бы очень удивлен, если это произойдет. Если моя теория верна, поскольку представления генерируются и срываются, ваш DOM в конечном итоге загрязняется десятками наборов теневых выпадающих списков, не связанных ни с чем. Это относится не только к Ember, но и к любой другой интерфейсной платформе OPA на основе MVC/шаблонов.
Наручники. Я также не смог понять, как получить значение, выбранное в диалоговом окне, для привязки к чему-либо полезному в такой структуре, как Ember, которая вызывает поля выбора через интерфейс типа {{view 'Ember.Select' value=country}}
. Другими словами, когда что-то выбрано, country
не обновляется. Это разбойник.
Волны. Кстати, те же самые проблемы касаются эффекта "волны" на кнопках. Вы должны инициализировать его каждый раз, когда создается кнопка. Я лично не забочусь о волновом эффекте и не понимаю, о чем идет речь, но если вам нужны волны, имейте в виду, что вы потратите большую часть своей жизни, беспокоясь о том, как инициализируйте каждую кнопку при ее создании.
Я ценю усилия, предпринятые материализованными ребятами из CSS, и там есть некоторые приятные визуальные эффекты, но он слишком велик и имеет слишком много исправлений, таких как выше, чтобы быть тем, что я использовал бы. Теперь я планирую вырвать материализацию CSS из своего приложения и вернуться либо к Bootstrap, либо к слою поверх Suit CSS. Ваши инструменты должны сделать вашу жизнь проще, а не сложнее.
Ответ 3
@littleguy23 Это правильно, но вы не хотите делать это для выбора multi. Так что просто небольшое изменение кода:
$(document).ready(function() {
// Select - Single
$('select:not([multiple])').material_select();
});
Ответ 4
Решение, которое сработало для меня, - это вызов функции "material_select" после загрузки данных параметров. Если вы распечатаете значение параметра OptionsList.find(). Count() в консоли, оно сначала 0, затем через несколько миллисекунд список будет заполнен данными.
Template.[name].rendered = function() {
this.autorun(function() {
var optionsCursor = OptionsList.find().count();
if(optionsCursor > 0){
$('select').material_select();
}
});
};
Ответ 5
Если вы используете Angularjs, вы можете использовать angular -materialize plugin, который предоставляет некоторые удобные директивы. Тогда вам не нужно инициализировать js, просто добавьте material-select
к вашему выбору:
<div input-field>
<select class="" ng-model="select.value1" material-select>
<option ng-repeat="value in select.choices">{{value}}</option>
</select>
</div>
Ответ 6
Для меня ни один из других ответов не работал, потому что я использую последнюю версию MaterializeCSS и Meteor, и существует несовместимость между версиями jquery, Meteor 1.1.10 использует jquery 1.11 (переопределение этой зависимости непросто и, вероятно, перерыв Meteor/Blaze) и тестирование Materialize с jquery 2.2 отлично работает. Подробнее см. fooobar.com/questions/62941/....
Это известная проблема с раскрывающимися списками и выборами в материализованных 0.97.2 и 0.97.3; для получения дополнительной информации см. https://github.com/Dogfalo/materialize/issues/2265 и https://github.com/Dogfalo/materialize/commit/45feae64410252fe51e56816e664c09d83dc8931.
Я использую Sass версию MaterializeCSS в Meteor и работала над проблемой, используя поэтическое: [email protected] в моем файле метеоритных пакетов, чтобы заставить старую версию. Теперь выпадающие меню работают, старый jquery и все!
Ответ 7
Вызвать материализующий код jssery css только после рендеринга html. Таким образом, вы можете иметь контроллер, а затем запустить службу, которая вызывает код jquery в контроллере. Это сделает кнопку выбора в порядке. Как правило, если вы пытаетесь использовать ngChange или ngSubmit, это может не работать из-за динамического стиля тега select.
Ответ 8
Это тоже работает: class= "browser-default"
Ответ 9
Просто для того, чтобы следить за этим, поскольку главный ответ рекомендует не использовать materializecss... в текущей версии материализации вам больше не нужно инициализировать выборки.