knockout data change knockout.js

knockout.js - data - knockout select change



Knockout Suscríbase a cualquier cambio en objeto complejo observable (1)

Tengo un modelo de vista que contiene un observable, que se inicializa con un objeto. este objeto en sí contiene observables.

mi objetivo es ser notificado cada vez que ese objeto cambie (o: cuando cambie cualquier observable en ese objeto)

jsfiddle

objeto complejo :

var ns = ns || {}; ns.ComplexObj = function (item) { var self = this; if (!item) { item = {}; } self.id = item.Id || ''''; self.company = ko.observable(item.Company || ''''); self.email = ko.observable(item.Email || ''''); self.company.subscribe(function () { console.log(''debug: company changed''); }); return self; };

modelo de vista

ns.mainvm = function () { var simpleObject = ko.observable(''i am pretty simple''); simpleObject.subscribe(function (newValue) { document.getElementById(''simpleSubscribtionFeedback'').innerText = newValue; }); var complexObject = ko.observable(ns.ComplexObj()); complexObject.subscribe(function (newValue) { // i would like to react to any change in complex object document.getElementById(''complexSubscribtionFeedback'').innerText = ''i dont get executed :(''; }); return { simpleObject: simpleObject, complexObject: complexObject }; };

Unión

var container = document.getElementById(''wrapper''); if (container) { ko.applyBindings(ns.mainvm, container); } else { console.warn("container for binding ko not found"); }

¿Existe alguna posibilidad de reaccionar ante cambios en un objeto complejo? Cualquier ayuda es apreciada.

Ya probé las soluciones de dirtyFlag (enlace en los comentarios), de rpniemeyer. El problema con una bandera sucia en el objeto complejo es que cuando cambia a "verdadero" y estoy enganchando a la suscripción de esa bandera, eso es solo correcto por primera vez. para reaccionar a nuevos cambios, necesitaría configurar el dirtyFlag en falso otra vez (después de hacer mis cosas en la suscripción). lo que llevaría a un bucle de suscripción.


Puedes usar el siguiente truco:

ko.computed(function() { return ko.toJSON(complexObject); }).subscribe(function() { // called whenever any of the properties of complexObject changes });

Ver http://jsfiddle.net/xcajt4qn/3/

La razón por la que esto funciona es que ko.toJSON leerá recursivamente todas las propiedades en el objeto, por lo tanto, la computación dependerá de todas las propiedades.