【发布时间】:2015-01-17 01:54:56
【问题描述】:
我有一个包含一个可观察对象的视图模型,它是用一个对象初始化的。 此对象本身包含可观察对象。
我的目标是在该对象发生更改时(或:当该对象中的任何可观察对象发生更改时)得到通知
复杂对象:
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;
};
视图模型
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
};
};
绑定
var container = document.getElementById('wrapper');
if (container) {
ko.applyBindings(ns.mainvm, container);
} else {
console.warn("container for binding ko not found");
}
是否有可能对复杂对象的更改做出反应?任何帮助表示赞赏。
我已经尝试了来自 rpniemeyer 的dirtyFlag 解决方案(cmets 中的链接)。复杂对象上的脏标志的问题是,当它切换到“真”并且我正在订阅该标志时,这只是第一次可以。为了对进一步的变化做出反应,我需要再次将dirtyFlag设置为false(在订阅中完成我的工作之后)。这将导致订阅循环。
【问题讨论】:
-
This post 可能会帮助您入门。
-
这个插件似乎完全符合你的要求:github.com/ZiadJ/knockoutjs-reactor
标签: knockout.js