1つのコレクションを使用して複数のビューを生成し、5秒ごとに1つのフェッチを生成しようとしています。Backbone.js複数のビュー、1つのコレクション、1つのフェッチ
以下は実際の例ですが、フェッチすると両方のビューが更新されます。 レスポンスを複数のURLにスプライスすることはできますが、リクエストの数を最小限に抑える必要があります。
私の現在の問題は、コレクションが再フェッチされたときに5秒ごとにすべてのビューを再レンダリングする必要はなく、変更された関連ビューのみです。 コレクション内に複数のモデルを作成し、パーズ関数に正しいオブジェクトを追加してみました。
応答:
{
"json-1": {
"sub_1": "3",
"sub_2": [],
},
"json-2": {
"sub_1": [],
"sub_2": "1",
},
}
//クライアント
を明確にする
const APICollection = Backbone.Collection.extend({
initialize: (models, options) => {
this.id = options.id;
},
url:() => {
return 'https://url.url/' + this.id;
},
model: APIModel,
parse: (resp) => {
return resp;
},
});
const ViewOne = Backbone.View.extend({
initialize: function() {
this.collection.bind('sync', this.render, this);
this.update();
_.bindAll(this, 'update');
},
render: function (n, collection) {
// Render view
},
update: function() {
let self = this;
this.collection.fetch({
update: true, remove: false, success: function() {
setTimeout(self.update, 5000);
}
});
}
});
// Also updates when re-fetched
const ViewTwo = Backbone.View.extend({
initialize: function() {
this.collection.bind('sync', this.render, this);
},
render: function (n, collection) {
// Render function
}
});
let col = APICollection([], {id: 'someid'});
new ViewOne({collection: col, el: $("#one")});
new ViewTwo({collection: col, el: $("#two")});
**更新: "に変更のみ関連するビュー"。これにより、 'ViewOne'は 'json-1'が変更されたときにのみ再レンダリングされ、 'ViewTwo'は再レンダリングされません。現在、両方のビューに完全な応答が送信されます。
"変更された関連ビューのみ。" - あなたはこれを明確にしなければならないでしょう、コレクションの特定のモデルは特定のビューに関連していますか? 1つのビューを別のビューと異なるコレクションにする方法 – mikeapr4
私は質問 – coop
を更新します。あなたの応答が配列を返さない場合、あなたは 'Backbone.Collection'ではなく' Backbone.Model'を使っているはずです。そうすれば、各ビューで 'change:attr'イベントを聞くことができます。 – mikeapr4