【问题标题】:Custom binding for a select can not handle objects as a value选择的自定义绑定无法将对象作为值处理
【发布时间】:2014-09-28 08:48:46
【问题描述】:

我有一个设置,在其中我使用基于 observableArray 的选项填充选择。该数组包含具有更多属性的对象,而不仅仅是一个 id 和一个名称。我希望能够使用完整的 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/

【问题讨论】:

标签: javascript knockout.js jquery-select2 knockout-3.0


【解决方案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

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

【讨论】:

    【解决方案2】:

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

    考虑这个例子

    <select 
        data-bind="
            options: options,
            value : selectedOption,
            optionsText: 'Name',
            optionsAfterRender: $root.setTitle
        "
     ></select><br />
    <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 Fiddle Demo

    确保您拥有 3.1.0 版本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 2016-05-15
      相关资源
      最近更新 更多