2011-11-16 32 views
6

有没有办法在值更改时调用一次某种方法?我创建了包装器bindingHandlers.value是调用这个方法:在更改值时调用自定义方法

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

可惜的是,当我改变了一些值myMethod的被称为两次监守来dependencyObservable也发生了变化。有任何想法吗?

回答

8

如果你只是想订阅改变的值,您可以订阅任何可观察到:

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

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

要订阅一个对象,你可以这样做的所有属性:

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

我有租赁计算器,需要具有约20个属性的对象,我想通过我的viewModel这个计算器作为参数,所以我想订阅大部分属性。 –

+0

您可以随时迭代属性,并且每个属性都是一个'observable'或'observableArray'调用'subscribe'(简单的方法可能只是测试每个属性是否具有'subscribe'函数) –

+0

已更新我的答案'subscribeAll'方法,请注意,它不会执行深度图,只是浅度。 –