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)
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ý.
[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
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. –
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