2014-11-19 24 views
14

Tôi có một khung nhìn có chứa một quan sát được khởi tạo với một đối tượng. đối tượng này có chứa các quan sát.Knockout Đăng ký bất kỳ thay đổi nào trong đối tượng phức tạp quan sát được

mục tiêu của tôi là để được thông báo bất cứ khi nào mà thay đổi đối tượng (hay: khi nào quan sát được ở chỗ thay đổi đối tượng)

jsfiddle

phức tạp đối tượng:

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

viewmodel

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

ràng buộc

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

có bất kỳ possiblity để phản ứng về thay đổi trên một đối tượng phức tạp? bất kỳ trợ giúp nào được đánh giá cao.

tôi đã thử các giải pháp dirtyFlag (liên kết trong các nhận xét), từ rpniemeyer. vấn đề với một lá cờ bẩn trên đối tượng phức tạp là, khi nó chuyển sang "true" và tôi đang hooking vào việc đăng ký của lá cờ đó, thats chỉ ok cho lần đầu tiên. để phản ứng với những thay đổi tiếp theo, tôi sẽ cần phải đặt dirtyFlag thành false một lần nữa (sau khi thực hiện công cụ của tôi trong đăng ký). sẽ dẫn đến vòng lặp đăng ký.

+0

[Bài đăng này] (https://roysvork.wordpress.com/2014/01/12/tracking-changes-to-complex-viewmodels-with-knockout-js/) có thể giúp bạn bắt đầu. – Michael

+0

cảm ơn nhận xét của bạn! tôi đã chỉnh sửa câu hỏi của tôi ở dưới cùng. –

+1

Plugin này dường như đang thực hiện chính xác những gì bạn đã làm: https://github.com/ZiadJ/knockoutjs-reactor – Domysee

Trả lời

29

Bạn có thể sử dụng các thủ thuật sau đây:

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

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

Lý do tại sao các công trình này là ko.toJSON đệ quy sẽ đọc tất cả các thuộc tính trong đối tượng, do đó làm cho các tính toán phụ thuộc vào tất cả các thuộc tính .

+2

tốt đẹp, cảm ơn rất nhiều! –

+3

Bạn đang điên vì tìm kiếm thủ thuật này. Nhưng cũng tuyệt vời. – kernel

+4

Lưu ý rằng điều này cũng sẽ được gọi bất cứ khi nào bất kỳ thay đổi thuộc tính * non * -observable của đối tượng, điều này có thể không được mong muốn. – tloflin

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