当使用notify和rateLimit扩展器计算时,订阅回调触发器两次

时间:2015-01-09 18:46:26

标签: knockout.js

当我使用computed notify ='always'和rateLimit extender时,订阅回调会触发两次。

    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/

  • 按“添加”键或在文本框中输入内容并查看结果

1 个答案:

答案 0 :(得分:0)

您在计算中调用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