#jquery-plugins #aurelia
#jquery-плагины #aurelia
Вопрос:
Я новичок в Aurelia Js, здесь я использую простое поле выбора, но оно не работает при изменении значения.
HTML :
<select value.bind="selectVal" change.delegate="changed()">
<option value="" disabled selected>Doc.Type</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
изменение.Модель делегирования
this.selectVal = '';
changed(){
alert();
}
: не запускается при изменении значения. Кроме того, значение datepicker не загружается в модель. В чем проблема? Это какая-либо проблема с моей стороны или формы Aurelia js.
Комментарии:
1. Вы можете использовать селекторы jquery только в
attached(){...}
случае вашего компонента (после рендеринга DOM).2. @JayDi извините, что вы имеете в виду селекторы jquery? например, $(‘#xx’).val() ?
3. Да, это так. Например: $(‘#dateStart’).datetimepicker({locale: ‘ru’,format: ‘ДД.ММ.ГГГГ’});
4. @JayDi $(‘.datepicker’).pickadate({selectMonths: true, selectYears: 15 }); $(‘select’).material_select(); это уже сделано.
5. @sibi Не могли бы вы уточнить, действительно ли вы используете jQuery / Materialize в этом случае? Я немного смущен, потому что в вашем исходном сообщении не упоминается ни один из них. 🙂 Если вы используете Materialize, здесь будет то, что его выбор не запускает событие изменения. Вам нужно будет зафиксировать это и запустить пользовательское событие. Это работает так, как в этом gist: gist.run/?id=4e7dd11228407e765844570409d210bd
Ответ №1:
При использовании Materialize (как стало очевидно из комментариев к исходным вопросам) элемент select не запускает никаких change
событий. Вам нужно будет прослушать change
событие jQuery и запустить a CustomEvent
в обработчике событий.
Вот так:
_suspendUpdate = false;
attached() {
$(this.option).material_select()
$(this.option).on('change', e => {
if (!this._suspendUpdate) {
let customEvent = new CustomEvent('change', {});
this._suspendUpdate = true;
this.option.dispatchEvent(customEvent);
this._suspendUpdate = false;
}
});
}
Примечание: suspendUpdate
«трюк» необходим, потому change
что CustomEvent также заставляет jQuery запускать собственное change
событие, которое вызывает бесконечный цикл.
Шаблон представления для приведенного выше фрагмента:
<template>
<require from="materialize/dist/css/materialize.css"></require>
<div class="input-field col s12">
<select ref="option" value.bind="optionSelect">
<option value="" disabled selected>Choose your option</option>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
<option value="3">Option 3</option>
</select>
<p>Selected value: ${optionSelect}</p>
</div>
</template>
Вот также gist.run, который демонстрирует этот подход:
https://gist.run/?id=4e7dd11228407e765844570409d210bd
Конечно, если вы используете Materialize с Aurelia, вы также можете использовать Materialize bridge: http://aurelia-ui-toolkits.github.io/demo-materialize/#/about
Отказ от ответственности: Я один из создателей Aurelia Materialize bridge.
Комментарии:
1. Привет, Дэниел, я попробовал ваш код, он выдает ошибку консоли: «app.js: 8 Uncaught RangeError: превышен максимальный размер стека вызовов». мне нужно запустить функцию при изменении.
2. Обновлено. Я не уверен, что
this
внутри обработчика jQuerychange
действительно работает, потому что jQuery переназначает его .. Если это так, вам нужно будет назначитьthis
другой var и использовать его внутри обработчика.3. @MatthewJamesDavis извините, готово.проверьте и не поддержите мой … лол