似乎Knockout在foreach绑定上方便的“afterRender”方法仅在添加数据时触发,而不会被删除。
你可以在这里测试 - http://jsfiddle.net/farina/4BaXs/1/点击加载初始化,查看四个警报,然后点击加载删除,注意没有任何反应。
所以,为了解决这个问题,我决定尝试创建一个手动订阅我的ko.mapping.fromJS数组,但这只会导致每次从AJAX更新数据时调用,即使数据没有改变。
我觉得映射插件在某种程度上失败了,并且认为数据总是新的,即使它不是。
是否存在某种仅在阵列发生变化时才会发生的事件?我对单个项目的订阅按预期工作,但显然您无法订阅整个项目列表?
答案 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;
});
};