即使映射数据相同,KnockoutJS也始终通知订阅

时间:2012-04-23 18:17:50

标签: knockout.js knockout-mapping-plugin

似乎Knockout在foreach绑定上方便的“afterRender”方法仅在添加数据时触发,而不会被删除。

你可以在这里测试 - http://jsfiddle.net/farina/4BaXs/1/点击加载初始化,查看四个警报,然后点击加载删除,注意没有任何反应。

所以,为了解决这个问题,我决定尝试创建一个手动订阅我的ko.mapping.fromJS数组,但这只会导致每次从AJAX更新数据时调用,即使数据没有改变。

我觉得映射插件在某种程度上失败了,并且认为数据总是新的,即使它不是。

是否存在某种仅在阵列发生变化时才会发生的事件?我对单个项目的订阅按预期工作,但显然您无法订阅整个项目列表?

1 个答案:

答案 0 :(得分:1)

我编写了一个使用ko.utils.compareArrays来找出变化的函数。 compareArrays绑定也使用foreach。我还使用your example and updated it来使用此功能。这是:

ko.subscribable.fn.subscribeArrayChanged = function(addCallback, deleteCallback) {
    var previousValue = undefined;
    this.subscribe(function(_previousValue) {
        previousValue = _previousValue;
    }, undefined, 'beforeChange');
    this.subscribe(function(latestValue) {
        var editScript = ko.utils.compareArrays(previousValue, latestValue);
        for (var i = 0, j = editScript.length; i < j; i++) {
            switch (editScript[i].status) {
                case "retained":
                    break;
                case "deleted":
                    if (deleteCallback)
                        deleteCallback(editScript[i].value);
                    break;
                case "added":
                    if (addCallback)
                        addCallback(editScript[i].value);
                    break;
            }
        }
        previousValue = undefined;
    });
};