我正在尝试使用 KnockoutJS 绑定来实现jQuery UI Multiselect 。我想它不能在本地完成,这就是制作这个插件的原因。
我正在使用插件。我在 php 代码中创建了我的多选,但输出 html 是这样的:
<select id="multiselectpoc" data-bind="multiselect : { config : multiSelectConfig,
options: _categories,
optionsText: '_name',
optionsValue: '_id',
value: selectedCategory,
optionsCaption: 'CATEGORY'}" title="Basic example" multiple="multiple" name="example-basic" size="5" style="display: none;">
</select>
我知道在 php 中创建它不是问题,因为我<select>
在 php 中创建了不是 jqueryUI Multiselects 的其他 's,并且它们的数据绑定有效。
这是我的视图模型(我使用打字稿):
class SearchFilterViewModel {
multiSelectConfig = {};
_countriesList = [];
_regionsList = [];
_countries = ko.observableArray();
_regions = ko.observableArray();
_categories = ko.observableArray([
new Category(name="Meat-Free Meat", 1),
new Category(name="Dairy-Free Dairy", 2),
new Category(name="Confectionery", 3),
new Category(name="Baking", 4),
new Category(name="Dessert", 5)
]);
selectedCountry = ko.observable();
selectedCity: KnockoutObservable<string> = ko.observable('');
selectedCategory: KnockoutObservable<string> = ko.observable('');
constructor(allCountries) {
for (var index = 0; index < allCountries.length; index++) {
this._countriesList.push(allCountries[index]);
}
this._countries(this._countriesList);
this.selectedCountry.subscribe(this.updateCities.bind(this))
}
updateCities(geonameId) {
var self = this;
self._regionsList = [];
$.ajax({
url: `http://api.geonames.org/children?geonameId=${geonameId}&username=elion`
}).then(function(allCitiesXML) {
var allCitiesJSON = xml2json(allCitiesXML);
var allCities = JSON.parse(allCitiesJSON);
for (var index = 1; index < allCities.geonames.length - 1; index++) {
self._regionsList.push(allCities.geonames[index].geoname);
}
self._regions(self._regionsList);
});
}
}
class Category {
_name: KnockoutObservable<string>;
_id: KnockoutObservable<number>;
constructor(name, id) {
this._name = ko.observable(name);
this._id = ko.observable(id);
}
}
$(document).ready(function() {
var _searchFilterViewModel: SearchFilterViewModel = new SearchFilterViewModel(allCountries);
var _searchFilterForm = $("#find-vegan-products-page").find("form")[0];
ko.applyBindings(_searchFilterViewModel, _searchFilterForm);
$('.select-multiple').each(function(i, obj) {
//obj[i] gets each element inside the div
$(this).multiselect();
})
});
这个问题主要是关于如何multiSelectConfig
在viewmodel中配置空对象。当我在 Web 浏览器中运行该页面时,其中的输出 html<select>
现在是许多<li>
标签,其中包含相当多的 jquery ui 多选代码,但重要的是每个标签内部<option></option>
都有<span>[object Object]</span>
哪些。<li>
标签的数量<li>
与类别相同,这让我认为数据绑定正在工作。我只需要点击 [object object] 来获取属性(category.name)。我怎么做?