「selected」というカスタム属性を持つ「Asset」バックボーンモデルがあります。サーバー側のオブジェクトの一部ではないという意味でのその習慣。ユーザーが現在選択しているアセットのリストを表すために使用します。
var Asset = Backbone.Model.extend({
defaults: {
selected: false
},
idAttribute: "AssetId"
});
このモデルは、サーバーから変更を取得するために定期的にフェッチするバックボーンコレクションの一部です。
私が抱えている問題は、コレクションをフェッチするたびに、コレクションがリセットを実行しているため(リセットイベントをリッスンすることでわかります)、選択された属性の値がajaxからのデータによって消去されることです。リクエスト。
backbone.jsのドキュメントは、この問題を解決するインテリジェントなマージがあることを示唆しているようです。フェッチメソッドでこれを行っていると思います
allAssets.fetch({ update: true ,cache: false});
また、モデルに「idAttribute」フィールドを設定して、入ってくるオブジェクトのIDをコレクション内のオブジェクトと比較できるようにしました。
これを解決する方法は、コレクションオブジェクトに独自のParseメソッドを記述することです。
parse: function (response) {
// ensure that the value of the "selected" for any of the models
// is persisted into the model in the new collection
this.each(function(ass) {
if (ass.get("selected")) {
var newSelectedAsset = _.find(response, function(num) { return num.AssetId == ass.get("AssetId"); });
newSelectedAsset.selected = true;
}
});
return response;
}
これを行うためのより良い方法はありますか?