2011-11-16 8 views
6

¿Hay alguna manera de invocar una vez algún método sobre el valor cambiado? He creado envoltura para bindingHandlers.value que invocar este método:invocar método personalizado en el valor cambiado

var update = bindingHandlers.value.update; 

bindingHandlers.value.update = function(element, valueAccessor, allBindingAccessor, viewModel) { 
    var newValue = ko.utils.unwrapObservable(valueAccessor()); 
    var elementValue = ko.selectExtensions.readValue(element); 
    var valueHasChanged = (newValue != elementValue); 

    update(element, valueAccessor, allBindingAccessor, viewModel); 

    if (valueHasChanged) { 
     myMethod(); 
    } 
} 

Desafortunadamente cuando cambio algún valor myMethod se llama dos veces becuase llegado dependencyObservable también se cambia. ¿Algunas ideas?

Respuesta

8

Si lo que desea es suscribirse a un valor cambiado, puede suscribirse a cualquier observable:

var viewModel = { property: ko.observable() }; 

viewModel.property.subscribe(function(newValue) { 
    //do stuff 
}); 

Para suscribirse a todas las propiedades de un objeto que podría hacer algo como:

function subscribeAll(viewModel) { 
    for(var propertyName in viewModel) { 
     if(viewModel[propertyName].subscribe === 'function') { 
      viewModel[propertyName].subscribe(function(newValue) { 
       //do stuff 
      } 
     } 
    } 
} 
+0

I tengo una calculadora de arrendamiento que necesita un objeto con aproximadamente 20 propiedades y me gustaría pasar mi viewModel a esta calculadora como parámetro, así que me gustaría suscribirme a la mayoría de las propiedades. –

+0

Siempre puede iterar las propiedades y cada una de las cuales es una llamada 'observable' o 'observableArray'' subscribe' on (la manera más fácil puede ser simplemente probar si cada propiedad tiene una función 'subscribe') –

+0

Actualicé mi respuesta con un Método 'subscribe all', tenga en cuenta que no hace gráficos profundos, solo superficiales. –

Cuestiones relacionadas