我正在尝试将一个简单的整数数组绑定到带有输入的无序列表,如下所示:
视图模型
self.amounts = ko.observableArray();
for (var i=0; i<5; i++){
self.amounts.push(ko.observable(i));
}
HTML
<ul data-bind="foreach: amounts">
<li><input type="text" data-bind="value: $data"/></li>
</ul>
这将生成列表,其中输入正确填入数字0-4。但是,当我更改任何输入的值时,ViewModel不会获取新值。
如果我使用一组简单对象作为observableArray,就像这样:
[{amt: 0}, {amt: 1}, {amt: 2}]
并调整HTML以将输入绑定到“amt”属性,然后更改输入中的值会触发ViewModel中的更改。
是否可以使用简单值数组并实现双向绑定,而无需使用更改原始数据模型的变通方法?如果是这样,我做错了什么?
编辑:此问题与被标记为重复Knockout JS - How to correctly bind an observableArray的问题不同, 它是关于简单类型元素的特殊双向绑定案例 - ints 或 strings 。
答案 0 :(得分:3)
看起来这是一个重复的问题,我的预感是正确的。 $ data将始终展开observable,因此您必须使用名称,值对象对的数组。
请参阅此问题:Knockout JS - How to correctly bind an observableArray
答案 1 :(得分:1)
$ data不起作用。相反,您可以创建一个对象数组,如下所示:
<ul data-bind="foreach: amounts">
<li>
<input type="text" data-bind="value: value" />
</li>
</ul>
<button data-bind="click: checkValues">Check</button>
。
var MyNumber = function (name, value) {
this.name = ko.observable(name);
this.value = ko.observable(value);
};
var VM = function () {
this.amounts = ko.observableArray();
this.checkValues = function () {
for (var i = 0; i < 5; i++) {
console.log('amount = ' + vm.amounts()[i].value());
}
};
};
var vm = new VM();
vm.amounts().push(new MyNumber('a', 1));
vm.amounts().push(new MyNumber('b', 2));
vm.amounts().push(new MyNumber('c', 3));
vm.amounts().push(new MyNumber('d', 4));
vm.amounts().push(new MyNumber('e', 5));
ko.applyBindings(vm);