我正在尝试使用knockout来创建一个监视视图模型以进行更改的场景,并通知任何订阅者发生了更改,这很正常并且通知被触发,然后我更改了视图并且视图模型更改了通知再次触发,就像在处理视图模型时仍然会观察到属性时,是否有任何解决此问题的方法。
var options = {
callback: function () {
var type = "modelChanged";
var subscription = $.config.core._subscriptions[type];
if (subscription) {
$.config.core._subscriptions[type] = null;
}
self.savePersonalInformation();
},
event: "forceSave",
moduleId: "MemberInformationPersonalInfo"
};
$.config.core.subscribeView(options);
注意:订阅视图是一个自定义扩展器,基本上是订阅包装器。
monitorPropertyValues: function (model) {
//subscribe to each property in the model to monitor changes to the value
// loop through all the properties in the model
for (var property in model) {
if (model.hasOwnProperty(property)) {
if (model[property].subscribe) { //subcribe to observable properties
// subscribe to changes
model[property].subscribe(function(value) {
if (value) {
$.config.core.notifySubscribers(true, "modelChanged");
}
});
}
}
}
}
初始化视图时会调用MonitorPropertyValues。
我想要实现的基本行为如下,我在页面上有一个选项卡列表,每个选项卡都有自己的视图模型。当我单击选项卡时,我想检查视图模型中是否有更改。如果有,我想向视图模型发送通知以保存所有更改。
答案 0 :(得分:2)
您可以使用computed
实现此类功能,该var viewModel = {
data: {
first: ko.observable("Ted"),
last: ko.observable("Smith")
},
isChanged: ko.observable(false)
}
viewModel.allChanges = ko.computed(function() {
ko.toJS(viewModel.data); //just touches all observables, that's it.
});
viewModel.allChanges.subscribe(function() {
if (!viewModel.isChanged()) {
viewModel.isChanged(true);
}
});
ko.applyBindings(viewModel);
会自动触及所有属性(这是使用ko.toJS完成的,它会遍历您的viewmodel)。这比你的扩展简单,不应该有任何处置问题。
{{1}}
此解决方案取自RP Niemeyer的小提琴,但我现在找不到原版。无论如何,信任归于他。