有没有办法创建一个ko.computed字段,通知数组元素的变化?ko.computed跟踪数组元素的变化
我首先想到的是使用observableArray,但它没有工作,因为
An observableArray tracks which objects are in the array, not the state of those objects
不过,我张贴这一段代码来说明什么,我想做。
HTML:
<div data-bind="foreach:arr">
<input type="text" value="" data-bind="value: a" />
</div>
<div data-bind="foreach:arr">
<p>
Field "a" is changed: <span data-bind="text: aChanged()? 'true': 'false'"></span>
</p>
</div>
<p>
Some "a" field from the array is changed: <span data-bind="text: someAChanged()? 'true': 'false'"></span>
</p>
的JavaScript:
function AppViewModel() {
this.arr = ko.observableArray([new A(), new A()]);
this.someAChanged = ko.computed(function() {
var ch = false;
var arr = this.arr();
for (var i = 0; i < arr.length; i ++) {
if (arr[i].aChanged()) {
ch = true;
break;
}
return ch;
}
}, this);
}
function A() {
this.a = ko.observable(1);
this.aChanged = ko.computed(function() {
return this.a() != 1;
}, this);
}
ko.applyBindings(new AppViewModel());
因为我没有权利回答我的问题,我在这里发布我的想法。 我决定使用“订阅”功能。我的解决方案是添加一个“父”链接到数组的元素。每当观察的领域得到改变依赖于它的孩子家长领域得到改变过:
function Child() {
this._parent = null;
this.observableField = ko.observable("");
this.observableField.subscribe(function (newVal) {
if (newVal... && this._parent) {
this._parent.anotherObservableField(...);
}
});
}
Child.prototype._setParent(parent) {...}
[那伏乃尔古普塔(http://stackoverflow.com/users/3846772/navneet-gupta)登载:“如何,如果新项目加入到observableArray它的工作他们如何订阅? ?” – 2015-06-18 06:32:12
@PeterO不应该是一个问题,因为计算调用this.arr(),所以它也注册到数组中,然后在'ko.utils.arrayForEach'调用中,将订阅'changed'道具的新增项目。 – Tyblitz 2015-06-18 08:08:24