2011-11-16 28 views
6

Có cách nào để gọi một lần một số phương pháp về giá trị đã thay đổi không? Tôi tạo ra wrapper cho bindingHandlers.value đó gọi phương pháp này:Gọi phương thức tùy chỉnh trên giá trị đã thay đổi

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

Unfortunatelly khi tôi thay đổi một số myMethod giá trị được gọi là hai lần bởi vì đến dependencyObservable cũng được thay đổi. Bất kỳ ý tưởng?

Trả lời

8

Nếu bạn chỉ muốn đăng ký vào một giá trị thay đổi, bạn có thể đăng ký bất kỳ quan sát:

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

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

Để đăng ký cho tất cả các thuộc tính của một đối tượng bạn có thể làm một cái gì đó như:

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

tôi có máy tính cho thuê cần đối tượng với khoảng 20 thuộc tính và tôi muốn chuyển viewModel của tôi tới máy tính này làm tham số, vì vậy tôi muốn đăng ký với hầu hết các thuộc tính. –

+0

Bạn luôn có thể lặp lại các thuộc tính và mỗi thuộc tính là một cuộc gọi 'observable' hoặc' observableArray' 'subscribe' (một cách dễ dàng có thể chỉ là kiểm tra nếu mỗi thuộc tính có chức năng 'subscribe') –

+0

Cập nhật câu trả lời của tôi với một Phương thức 'subscribeAll', lưu ý rằng nó không làm đồ thị sâu, chỉ là những đồ thị cạn. –

Các vấn đề liên quan