使用 notify 和 rateLimit extender 计算时订阅回调触发两次
Subscribe callback triggers twice when use computed with notify and rateLimit extender
当我使用计算通知='always' 和 rateLimit 扩展器时,订阅回调触发两次。
ko.changedFlag = function(root) {
var result = function() {};
var initialState = ko.observable(ko.toJSON(root));
result.isChanged = ko.computed(function() {
var changed = initialState() !== ko.toJSON(root);
if (changed) result.reset();
return changed;
}).extend({ notify: 'always',rateLimit:500 });
result.reset = function() {
initialState(ko.toJSON(root));
};
return result;
};
// add changed flag property to the model
model.changedFlag = new ko.changedFlag(model);
// subscribe to changes
model.changedFlag.isChanged.subscribe(function(isChanged) {
if (isChanged) alert("model changed");
});
示例:http://jsfiddle.net/GQgpX/39/
- 按 "add" 键或在文本框中输入内容并查看结果
在这种情况下,您在计算中调用 reset
(它修改了计算已经依赖的可观察对象)导致了无关的通知。
您可能想要执行以下操作:
result.isChanged = ko.computed(function() {
return initialState() !== ko.toJSON(root);
}).extend({ notify: 'always', rateLimit: 500 });
result.isChanged.subscribe(function(changed) {
if (changed) {
result.reset();
}
});
您的订阅仍会被调用两次,第一次是在标志指示更改时,第二次是 isChanged
作为 false
来自 reset
调用。
当我使用计算通知='always' 和 rateLimit 扩展器时,订阅回调触发两次。
ko.changedFlag = function(root) {
var result = function() {};
var initialState = ko.observable(ko.toJSON(root));
result.isChanged = ko.computed(function() {
var changed = initialState() !== ko.toJSON(root);
if (changed) result.reset();
return changed;
}).extend({ notify: 'always',rateLimit:500 });
result.reset = function() {
initialState(ko.toJSON(root));
};
return result;
};
// add changed flag property to the model
model.changedFlag = new ko.changedFlag(model);
// subscribe to changes
model.changedFlag.isChanged.subscribe(function(isChanged) {
if (isChanged) alert("model changed");
});
示例:http://jsfiddle.net/GQgpX/39/
- 按 "add" 键或在文本框中输入内容并查看结果
在这种情况下,您在计算中调用 reset
(它修改了计算已经依赖的可观察对象)导致了无关的通知。
您可能想要执行以下操作:
result.isChanged = ko.computed(function() {
return initialState() !== ko.toJSON(root);
}).extend({ notify: 'always', rateLimit: 500 });
result.isChanged.subscribe(function(changed) {
if (changed) {
result.reset();
}
});
您的订阅仍会被调用两次,第一次是在标志指示更改时,第二次是 isChanged
作为 false
来自 reset
调用。