2012-03-15 18 views
19

Tengo un modelo de vista con observableArray (llamado 'todo') de objetos. Una de las propiedades de ese objeto es un nombre observable seleccionado. Quiero que se ejecute algún código siempre que cambie la propiedad seleccionada del objeto secundario del conjunto. Intenté suscribirme manualmente al all a través de all.subscribe(), pero ese código solo se dispara cuando se agregan o eliminan elementos. Actualicé el código para hacerlo así:Knockout.JS Arreglos observables de la matriz en elementos observables individuales

all.subscribe(function() { 
    ko.utils.arrayForEach(all(), function (item) { 
     item.selected.subscribe(function() { 
      //code to fire when selected changes 
     }); 
    }); 
}); 

¿Es esta la manera correcta de hacer esto o hay una manera mejor?

Respuesta

20

Esto está cerca de corregir. Las suscripciones de matriz observable son solo para cuando se agregan o eliminan elementos, no se modifican. Así que si desea suscribirse a un elemento en sí, que necesita para, así, suscribirse al artículo en sí mismo:

Punto clave: Un pistas observableArray la que los objetos se encuentran en la matriz, no el estado de aquellos objetos

Poner simplemente un objeto en un array observable no hace que todas las propiedades de ese objeto sean observables por sí mismas. Por supuesto, puede hacer que esas propiedades sean observables si lo desea, pero esa es una opción independiente. Un Array observable solo rastrea qué objetos contiene y notifica a los oyentes cuando se agregan o eliminan los objetos.

(from Knockout documentation)


digo "cercano al correcto", ya que tendrá que eliminar todos los viejos suscripciones. Actualmente, si la matriz observable comienza como [a, b], se suscribe a [a, b], pero luego si se agrega c tiene dos suscripciones para a y b más una para c.

+0

Si elimino la matriz anterior con 'all ([])', ¿eso matará todas las suscripciones? El usuario realmente no interactúa directamente con esta colección, es como una colección de casillas de verificación y no se cambia dinámicamente. – arb

+0

¿Por qué es una matriz observable entonces? Simplemente haz que sea una matriz normal que contenga objetos con propiedades observables. – Domenic

+0

Para responder realmente a su pregunta: no, no lo hará. Las suscripciones solo se eliminan al llamar a 'subscription.dipose()', como se ve en la parte inferior de http://knockoutjs.com/documentation/observables.html – Domenic

Cuestiones relacionadas