0

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

您可以在此处进行测试 - http://jsfiddle.net/farina/4BaXs/1/单击加载初始值,查看四个警报,然后单击加载删除并注意没有任何反应。

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

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

是否有某种事件仅在数组更改时发生?我对单个项目的订阅按预期工作,但显然您不能订阅整个项目列表?

4

1 回答 1

1

我写了一个函数ko.utils.compareArrays来找出发生了什么变化。compareArrays也被foreach绑定使用。我还拿了您的示例并对其进行了更新以使用此功能。这里是:

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;
    });
};
于 2012-05-02T00:15:15.993 回答