繁体   English   中英

Knockout.js在foreach绑定中绑定选择选项和值

[英]Knockout.js Binding of select options and value inside a foreach binding

我试图以这样一种方式创建一组下拉列表,以便可以将新的下拉列表动态添加到该列表中。 一个示例是订购比萨饼的表单,其中带有一组用于浇头的选择标签。 我们不知道用户想要多少个浇头,因此我们将从一个开始,并在用户选择第一个浇头时动态添加一个新的选择。

我遇到的问题是选择上的值绑定无法正常工作。 如果最初设置了值对象,则select将绑定到它,但是任何更改都不会更新VM中的可观察对象。

我尝试了各种不同的方法,以基于$ data的方式进行绑定,使用别名,使用不同的上下文返回对象,并使用虚拟元素在不同的地方绑定上下文等。

这个示例有些人为,因为实际上还会涉及其他代码来添加更多选择,等等,但是它确实复制了我所看到的问题。 只需选择几个浇头,然后单击“检查值”按钮以查找未在VM中设置的选项。

http://jsfiddle.net/x6u0hutm/5/

<!-- ko foreach: {data: selectedPropertyNames} -->
<select data-bind="options:$root.nameOptions, value: $data, optionsCaption:'Pick One'"></select>
<!-- /ko -->
<button type="button" data-bind="click: checkValues">Check Values</button>

function ViewModel() {
    var self = this;
    this.nameOptions = ko.observableArray([]);
    this.selectedPropertyNames = ko.observableArray([]);

    var firstSelection = ko.observable(null);
    this.selectedPropertyNames.push(firstSelection);

    var secondSelection = ko.observable('Beef');
    this.selectedPropertyNames.push(secondSelection);

    this.nameOptions(['Pepperoni', 'Beef', 'Pineapple', 'Green Peppers', 'Extra Cheese']);

    this.checkValues = function () {
        for (var i = 0; i < self.selectedPropertyNames().length; i++) {
            console.log(self.selectedPropertyNames()[i]());
        }
    }
};

ko.applyBindings(new ViewModel());

问题出在这里foreach数据绑定。

<!-- ko foreach: {data: selectedPropertyNames} -->
<select data-bind="options:$root.nameOptions, value: $data, optionsCaption:'Pick One'"></select>
<!-- /ko -->

您将值绑定到$ data,这是变量的内容,而不是变量引用本身。 如果您将绑定更改为

<select data-bind="options:$root.nameOptions, value: $root.selectedPropertyNames()[$index()], optionsCaption: 'Pick One'"></select>

然后它将正常工作。 更新的小提琴位于http://jsfiddle.net/newuserjs/4o80aebr/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM