【问题标题】:knockout.js selectedOptions is not updatedknockout.js selectedOptions 未更新
【发布时间】:2013-06-05 12:41:16
【问题描述】:

我在为 knockout.js selectedOptions 绑定而苦苦挣扎。

我用 observableArray A 中的项目填充多选,选择一些,将结果存储在 observableArray B 中。当项目从数组 A 中删除时,B 数组不会更新。

这是淘汰赛问题还是我做错了什么?

HTML 代码:

<h4>All items:</h4>
<div data-bind="foreach: items">
    <p data-bind="text: name"></p>
    <button data-bind="click: $parent.remove">Remove item</button>
</div>

<select multiple="multiple" data-bind="
    options: items,
    selectedOptions: selectedItems,
    optionsText: 'name',
    optionsCaption: 'Choose one or more...'
"></select>

<h4>Selected items:</h4>
<div data-bind="foreach: selectedItems">
    <p data-bind="text: name"></p>
</div>

Javascript:

var viewModel = {
    items: ko.observableArray([
        { name: "Item 1", id: "1" },
        { name: "Item 2", id: "2" },
        { name: "Item 3", id: "3" }
    ]),
    selectedItems: ko.observableArray(),
    remove: function(item) {
        viewModel.items.remove(item);
    }
}

ko.applyBindings(viewModel);

这是小提琴:http://jsfiddle.net/3FYAe/

如何重现:

  1. 在多选字段中选择一个或多个项目,它们会出现在下面的列表中(“所选项目”)

  2. 删除其中一项

  3. 选择框已更新

    4.

    • 预期:“所选项目”已更新
    • 实际:“所选项目”保留已删除的值

【问题讨论】:

    标签: javascript binding knockout.js


    【解决方案1】:

    回答我自己的问题:

    简单的解决方案是也从 selectedItems 数组中删除该项目,即。 e.

    remove: function(item) {
        viewModel.items.remove(item);
        viewModel.selectedItems.remove(item);
    }
    

    更新小提琴:http://jsfiddle.net/3FYAe/1/

    但是,我想找到一个更好的解决方案,因为我要处理更多的列表和更多的依赖项;这只是一个简化的例子。

    【讨论】:

    • 从 Knockout 的角度来看,itemsselectedItems 是两个完全独立的数组,有时它们恰好具有相同的元素。因此,如果这是您的要求,您有责任将这两个数组保存在 sysnc 中。
    • @nemesv 我有点希望 selectedOptions 绑定可以防止其中包含不存在的值
    • 您可以通过复制 KO 附带的代码来创建自定义“betterSelectedItems”绑定。在您的版本中,订阅 options 数组并在您的回调中从 selectedItems 数组中删除不再在 options 数组中的所有项目。
    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2017-04-16
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多