首页 文章

select的自定义绑定无法将对象作为值处理

提问于
浏览
1

我有一个设置,我在其中使用基于observableArray的选项填充选择 . 此数组包含的对象具有的属性多于id和name . 我希望能够使用完整的javascript对象作为选定的值 .

数据是这样的:

this.optionData = ko.observableArray([
    {id: 1, name: "One", param: true},
    {id: 2, name: "Two", param: true},
    {id: 3, name: "Three", param: true},
]);

并且在淘汰赛中使用标准绑定非常简单

<select data-bind="
   options: optionData,
   optionsText: 'name',
   optionsCaption: 'Please select',
   value: selectedOption">
</select>

但是,我想为我的选择设置样式,并为它们添加更多功能 . 我使用select2 . 我已经提出了以下自定义绑定,这适用于带有optionsText和optionsValue的简单绑定 - 但它不适用于没有optionsValue的选项绑定(即使用对象作为值时) .

ko.bindingHandlers.select2 = {
init: function (el, valueAccessor, allBindingsAccessor, viewModel) {

    ko.utils.domNodeDisposal.addDisposeCallback(el, function () {
        $(el).select2('destroy');
    });

    var allBindings = allBindingsAccessor(),
        select2 = ko.utils.unwrapObservable(valueAccessor());

    $(el).select2(select2);
},

update: function (element, valueAccessor, allBindingsAccessor, viewModel) {

    var selectedOptions = ko.unwrap(allBindingsAccessor.get("selectedOptions")),
        val = ko.unwrap(allBindingsAccessor.get("value")),
        options = ko.unwrap(allBindingsAccessor.get("options"));

    if ($(element).prop('multiple')) {
        $(element).select2('val', selectedOptions, true);
    }
    else {
        $(element).select2("val", val);
    }

    $(element).trigger('change');
}

};

我的问题是,我需要更新什么才能使我的自定义绑定作为默认的敲除选项绑定?

我做了这个小提琴来证明这个问题:http://jsfiddle.net/SuneRadich/LdF45/1/

2 回答

  • 1

    我的示例可能有助于使用optionsAfterRender来获取对象 .

    <select id="selectArticles" multiple
     data-bind="options: availableArticles, selectedOptions: selectedArticles,
     optionsText: function(item){return item.title},
     optionsAfterRender: function(option, item){option.value = item}">
    </select>
    

    workding fiddle

    如有必要,我可以将其更改为单选 .

  • 1

    您可以使用 optionAfterRender 属性为 select 添加更多功能 .

    考虑这个例子

    <select 
        data-bind="
            options: options,
            value : selectedOption,
            optionsText: 'Name',
            optionsAfterRender: $root.setTitle
        "
     ></select>
    <button data-bind="click: showSelectedOptions">Show selection</button> function Option(id, name){ var self = this; self.Id = id; self.Name = name; } function ViewModel(){ var self = this; self.options = ko.observableArray([ new Option(0, "NormalText"), new Option(1, "AnotherText"), new Option(2, "WaaaaaaaaaaaaaaaayTooLongText") ]); self.selectedOption = ko.observable(); self.showSelectedOptions = function(){ console.log(self.selectedOption()); } self.setTitle = function(option, item) { option.title = item.Name // other properties } } ko.applyBindings(new ViewModel());

    SQL小提琴演示

    确保您有3.1.0版

相关问题