有沒有辦法創建一個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