2011-11-16 15 views
6

C'è un modo per richiamare una volta un metodo su un valore modificato? Ho creato wrapper per bindingHandlers.value che invocare questo metodo:Richiamare il metodo personalizzato sul valore modificato

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(); 
    } 
} 

Purtroppo quando cambio un valore myMethod viene chiamato due volte becuase venire dependencyObservable è anche cambiato. Qualche idea?

risposta

8

Se si desidera solo per iscriversi a un valore cambiato, è possibile iscriversi a qualsiasi osservabile:

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

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

Per iscriversi a tutte le proprietà di un oggetto si potrebbe fare qualcosa di simile:

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

I avere un calcolatore di leasing che ha bisogno di oggetti con circa 20 proprietà e vorrei passare il mio viewModel a questa calcolatrice come parametro, quindi mi piacerebbe iscrivermi alla maggior parte delle proprietà. –

+0

Puoi sempre iterare le proprietà e ognuna che è una chiamata 'observable' o' observableArray' 'subscribe' on (il modo semplice potrebbe essere semplicemente testare se ogni proprietà ha una funzione' subscribe') –

+0

Aggiornato la mia risposta con un metodo 'subscribeAll', si noti che non crea grafici profondi, solo quelli poco profondi. –

Problemi correlati