【问题标题】:Knockout SelectedOptions with non-multi select用非多选淘汰 SelectedOptions
【发布时间】:2014-03-19 14:14:43
【问题描述】:

早安,

我有一个类似这样的对象的场景:

{
 options: [{},{},{}], //array of objects
 selected: [], //array of selected objects
 multiselect: false,  //determine if one or multiple values should be selectable
}

我想把这个对象绑定到模板中的一个select元素上,如下:

<select data-bind="selectedOptions: selected, options: options, attr: { multiple: multiselect }"></select>

我的希望是,即使它是单个项目选择列表,它也会将值推送到选定的数组中。 不幸的是,非多选列表上的 selectedOptions 似乎没有默认值到数组中:

这是一个显示我的意思的小提琴: http://jsfiddle.net/LkqTU/15444/

请注意,在第一个选择列表中的选项被选中之前,第一个显示的值为 0。

是否可以直接更改此功能?我不希望用其他 javascript 将第一个值推送到数组中(在某些情况下,我可能根本不会渲染选择对象,因此必须使用广泛的逻辑)。 创造价值的方法怎么样:而不是在数组上推送/弹出?

希望在我必须编写自定义绑定或某种东西之前有一些简单的东西。

【问题讨论】:

  • 你想在 selectedOption 中推送每个选定的值是对的吗?

标签: arrays knockout.js


【解决方案1】:

我最终使用自定义绑定来处理场景

ko.bindingHandlers.selectedValues = {
//support an array with single value, for making my life easier.
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    var arraystore = ko.unwrap(valueAccessor());
    if ($.type(arraystore) != 'array')
        throw ('Custom Binding -- Wrong data type used with this binding');
    var val = ko.observable(arraystore[0]);
    val.subscribe(function (newval) {
        arraystore.length = 0;
        arraystore.push(newval);
    });
    ko.applyBindingsToNode(element, { value: val });
}

}

然后我在两个模板之间关闭。不幸的是,还有很多额外的工作:(

【讨论】:

    【解决方案2】:

    您可以使用订阅来保持“选定”与 svalue 同步。 http://jsfiddle.net/LkqTU/15468/

    <div>
      <select data-bind="value: svalue, options: options"></select>
      <br />
      Items in Array: <div data-bind="text: JSON.stringify(selectedOptions())"></div>
      Selected Value: <div data-bind="text: svalue"></div>
    </div>
    
    var ViewModel = function() {
      var self = this;
      this.options = [1, 2, 3, 4, 5];
      this.selectedOptions = ko.observableArray([]);
      this.svalue = ko.observable();
      this.count = ko.computed(function() {
        return this.selectedOptions().length;
      }, this);
    
      this.svalue.subscribe(function(new_v) {
        if (new_v) self.selectedOptions([new_v]);
      });
    };
    
    ko.applyBindings(new ViewModel());
    

    【讨论】:

    • 感谢您抽出宝贵的时间来写回复:) 然而,是否选择多选并不是问题。当列表是非多选时,将默认选择仍然存储到 selectedOptions 列表中,而不是获取值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2018-03-22
    • 2014-05-02
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多