Có cách nào để tạo trường ko.computed được thông báo về các thay đổi xảy ra với các phần tử của mảng không?thay đổi theo dõi ko.com đã quy đổi của các phần tử của mảng
Suy nghĩ đầu tiên của tôi là sử dụng observableArray, nhưng nó đã không làm việc, bởi vì
An observableArray tracks which objects are in the array, not the state of those objects
Tuy nhiên, tôi đang đăng đoạn mã này để minh họa cho những gì tôi đang cố gắng để làm.
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());
Như tôi không có quyền trả lời câu hỏi của riêng tôi, tôi gửi bài ý tưởng của tôi ở đây. Tôi quyết định sử dụng chức năng "đăng ký". Giải pháp của tôi là thêm liên kết "cha mẹ" vào các phần tử của một mảng. Bất cứ khi nào một lĩnh vực quan sát được thay đổi một lĩnh vực phụ thuộc vào cha mẹ trẻ em của nó bị thay đổi quá:
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) {...}
[Navneet Gupta] (http://stackoverflow.com/users/3846772/navneet-gupta) đăng này: "Làm thế nào để cho nó hoạt động nếu các mặt hàng mới được thêm vào observableArray Làm thế nào họ đã đăng ký? ? " –
@ PeterO không phải là một vấn đề, khi tính toán gọi 'this.arr()', do đó, nó đăng ký vào mảng là tốt, sau đó trong cuộc gọi 'ko.utils.arrayForEach', sẽ đăng ký để' thay đổi' prop của mục mới được thêm vào. – Tyblitz