0

foreachバインディングでのKnockoutの便利な「afterRender」メソッドは、データが追加されたときにのみ起動し、削除されないようです。

ここでそれをテストできます - http://jsfiddle.net/farina/4BaXs/1/で [load initial] をクリックし、4 つのアラートを確認してから [load delete] をクリックしても何も起こらないことに気付きます。

そこで、この問題を解決するために、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 に答える