一括編集オプション (MVC3) を使用して HTML テーブルにバインドするObservableArray
コレクションがあります。ユーザーがコミットするたびに、viewmodel リスト全体を送信するのではなく、コレクションから変更された行のみを送信したかったのですが、追跡する最善の方法があればアドバイスしてくださいまたは変更された行のみをフィルタリングします。
2 に答える
これは、オブジェクト内のすべてのオブザーバブルへの変更を追跡する Knockout でのダーティ フラグの作成に関する投稿です。
通常、コンストラクター関数で配列内の各項目にダーティ フラグを追加するか、各項目をループしてフラグを追加します。次に、計算されたオブザーバブルを作成して、変更されたアイテムのみを表し、サーバーに送り返すことができます。
以下は、各アイテムのダーティ フラグと、ダーティ アイテムのみを含む計算されたオブザーバブルを示すサンプルです: http://jsfiddle.net/rniemeyer/wauwn/
見た目ほど簡単な作業ではありません。
最初は、オブザーバブル配列は配列の変更(挿入、削除、並べ替えなど) のみを処理し、要素の変更は処理しません。
次に、各テーブル行にバインドするモデルに「isModified」などの特別なフラグが必要になる可能性があります。
次に、バインディングの一部が更新された場合は、そのフラグを設定する必要があります。Knockoutjs オブザーバブルは、オブザーバブルが更新されたときに独自の関数を呼び出すことができるメソッド subscribe を提供します。ページhttp://knockoutjs.com/documentation/observables.htmlを見てください。下部に「明示的にオブザーバブルにサブスクライブする」というセクションがあります。
そのタスクを実行するコードの簡単なドラフトがあります
function CreateArrayElementViewModel(inputData) {
// Creating our view model
var result = {
prop : ko.observable(inputData.prop),
val : ko.observable(inputData.val),
isModified: false // This property would be true if entity was edited
};
// Iterate over all properties and subscribe to knockoutjs observables
for(prop in result) {
if (typeof(result[prop].subscribe) != 'undefined') {
result[prop].subscribe(function() { result.isModified = true; });
}
}
return result;
}