Я пытаюсь получить bootstrap-multiselect для работы с Aurelia. получили работу более или менее, но не уверены, что это лучшее решение или я могу столкнуться с проблемами.плагин boostrap-multiselect в Aurelia
Bootstrap-MultiSelect является JQuery плагин, который превращает обычный выбор (мульти) в раскрывающихся с флажками (http://davidstutz.github.io/bootstrap-multiselect/)
Моя первая проблема заключается, чтобы заставить его работать с динамически создаваемыми вариантов. Я решил, что с помощью функции «rebuild» плагинов изменяется мой массив параметров (созданный как свойство bindable). Однако параметры исходного выбора hhas тогда еще не созданы, поэтому я использую setTimeout для задержки восстановления, так что Aurelia перестроил выбор. Чувствуется как «грязное» решение, и я мало знаю об аутриезе Aurelia, чтобы быть уверенным, что он всегда будет работать.
Вторая проблема заключается в том, что значение для компонента не будет обновляться, однако метод изменения будет срабатывать. Я решил это, выпустив событие изменения (нашел пример для другого плагина, который делает то же самое). Прекрасно работает, значение будет обновлено, но метод изменения будет срабатывать дважды. Не большая проблема, но может быть проблемой, если какое-то изменение требует много времени (например, получение данных из базы данных и т. Д.).
Любые предложения по улучшению кода?
<template>
<select value.bind="value" multiple="multiple">
<option repeat.for="option of options"Value.bind="option.value">${option.label}</option>
</select>
</template>
import {customElement, bindable, inject} from 'aurelia-framework';
import 'jquery';
import 'bootstrap';
import 'davidstutz/bootstrap-multiselect';
@inject(Element)
export class MultiSelect {
@bindable value: any;
@bindable options: {};
@bindable config: {};
constructor(private element) {
this.element = element;
}
optionsChanged(newVal: any, oldVal: any) {
setTimeout(this.rebuild, 0);
}
attached() {
var selElement = $(this.element).find('select');
selElement.multiselect(
{
includeSelectAllOption: true,
selectAllText: "(All)",
selectAllNumber: false,
numberDisplayed: 1,
buttonWidth: "100%"
})
.on('change', (event) => {
if (event.originalEvent) { return; }
var notice = new Event('change', { bubbles: true });
selElement[0].dispatchEvent(notice);
});
}
detached() {
$(this.element).find('select').multiselect('destroy');
}
rebuild =() => {
$(this.element).find('select').multiselect('rebuild');
}
}
У меня были одни и те же проблемы с DataTables и в итоге я написал свои собственные. Связывание Aurelia удивительно, но я еще не научился запускать событие, когда обновления DOM завершились. Здесь вы хотите обратить ваше внимание - как запустить метод 'rebuild' компонента в нужный момент. – LStarky