KnockoutJS selectedOptions 未显示

KnockoutJS selectedOptions not showing up

我正在使用 KnockoutJS 来管理我的网络前端。我正在编写一个 CRUD/Admin 站点,但我遇到了 selectedOptions 绑定的问题。

案例:

我做错了什么?我看到了相互矛盾的建议,其中一些已经过时,所以我不确定如何继续。

selectedOptions 绑定按设计工作。

你的错误很可能是你的 selected observable 不包含 identical 对象(即 references all 中的对象),但仅仅是 属性 值相等的对象。

Knockout 通过对象标识维护绑定,它不进行任何其他比较。

考虑这个简单的例子:

var vm = {
    products: {
        selected: ko.observableArray(),
        all: ko.observableArray([
            {
                value: {
                    name: {
                        unName: ko.observable("Foo")
                    }
                }
            }, {
                value: {
                    name: {
                        unName: ko.observable("Bar")
                    }
                }
            }
        ])
    }
};
vm.products.selected.push(vm.products.all()[1]);
ko.applyBindings(vm);
pre {
  font-size: small;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script>

<select required="" multiple="" class="form-control" data-bind="
    options: products.all, 
    optionsText: function (item) { 
        return item.value.name.unName(); 
    }, 
    selectedOptions: products.selected
"></select>

<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>


不相关的旁注:尽量避免在绑定属性中定义函数。它丑陋、低效、可能重复而且不是很惯用。在视图模型上做一个相应的属性,例如这样:

function Product(data) {
    ko.utils.extend(this, data);
    this.displayName = this.value.name.unName;
}

<div data-bind="with: products">
    <select required="" multiple="" class="form-control" data-bind="
        options: all, 
        optionsText: 'displayName', 
        selectedOptions: selected
    "></select>
</div>