¿Hay alguna manera de crear un campo ko.computed notificado de los cambios que se producen en los elementos de una matriz?cambios de seguimiento ko.computed de los elementos de una matriz
Lo primero que pensé fue utilizar observableArray, pero no funcionó, porque
An observableArray tracks which objects are in the array, not the state of those objects
Aún así, les dejo este pedazo de código para ilustrar lo que estoy tratando de hacer.
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());
Como no tengo ningún derecho a responder a mis propias preguntas, les dejo mi idea aquí. Decidí usar la función "suscribir". Mi solución es agregar un enlace "principal" a los elementos de una matriz. Siempre que un campo observable se cambia un campo de matriz dependiente de sus hijos se cambia demasiado:
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) ha publicado esto: "¿Cómo funciona si se agregan nuevos elementos en el observableArray ¿Cómo están suscritos a? ? " –
@PeterO no debería ser un problema, ya que el cálculo invoca 'this.arr()', por lo que también se registra en la matriz, luego en la llamada 'ko.utils.arrayForEach', se suscribirá a' changed' prop del artículo recién agregado. – Tyblitz