如何利用Aurelia与Select2的数据绑定?它似乎与标准选择一样好用。
理想情况下,我想在select元素中使用change.delegate来调用View Model中的方法,这样我就可以访问我们正在注入的数据存储。
我可以触发事件的唯一方法是在附加()处理程序中连接一个更改事件,但随后数据存储超出范围。
查看:
<template>
<label>Company:</label>
<!-- i would like to use change.delegate="change()" below -->
<select value.bind="selectedCompanies" multiple>
<option repeat.for="company of companies" model.bind="company.CompanyId">${company.CompanyName}</option>
</select>
</template>
查看型号:
import {inject, bindable} from 'aurelia-framework';
import {FilterCompanyData} from 'data/custom elements/filters/filterCompanyData';
import {UserStorage} from 'storage/userStorage';
@inject(Element, FilterCompanyData, UserStorage)
export class FilterCompanyCustomElement {
@bindable selectedCompanies;
constructor(element, filterCompanyData, userStorage) {
this.element = element;
this.filterCompanyData = filterCompanyData;
this.userStorage = userStorage;
this.companies = [];
}
bind(bindingContext, overrideContext) {
let userId = this.userStorage.userId;
return this.filterCompanyData
.getCompanies(userId)
.then(response => this.companies = response);
}
attached() {
var el = $(this.element).find('select');
var sel = el.select2({
closeOnSelect: false
});
// Is it possible to get rid of this?
sel.on('change', function (event) {
if (event.originalEvent) { return; }
// TODO add changed data to user storage
var IE = ((navigator.userAgent.indexOf("MSIE") != -1) || (!!document.documentMode == true));
var notice = IE ? new CustomEvent('change', { bubble: false }) : new Event('change', { bubble: false });
$(el)[0].dispatchEvent(notice);
});
}
detached() {
$(this.element).find('select').select2('destroy');
}
change() {
// I'd like to use this method from change.delegate
// TODO add changed data to user storage
}
}
另一方面,Aurelia没有为New Event设置内置的polyfill? IE似乎不喜欢这样。
答案 0 :(得分:0)
我看到这个问题已经过时了,但我已经尝试过你在这里做的事情,我最终得到了以下内容:
https://github.com/Kla3mus/select24aurelia
我没有使用polyfill,也没有使用组件外部的原始事件。我对选项和选定值使用双向绑定。也许那对你也有用吗?
它是用TypeScript编写的,但它与JavaScript几乎相同,所以我认为你可以修改它:)