fetch
イニシャルの後に(ユーザーのアクションに応答して)aが呼び出されるとfetch
、新しくフェッチされたモデルの多くは、イニシャルの既存のモデルと同様になる可能性がありますfetch
。オプションを指定して呼び出すfetch
とadd: true
、コレクションに重複するモデルが存在する可能性があります。
問題:コレクションから既存のすべてのモデル(たとえばwith id=1,2,3,4
)を削除し、新しくフェッチされたモデル(id=1,2,3,5
)を挿入する代わりに、次の2つの操作を実行できます。
新しいモデルのみを追加する
id=5
と、コレクションが作成されid=1,2,3,4,5
ます。次に、新しいビューのみをレンダリングします(id=5
)新しいモデルを追加し、新しい( )
id=5
にないモデルを削除します。次に、新しいビュー()をレンダリングし、古いビュー( )を削除しますfetch
id=4
id=5
id=4
試み:
を呼び出す代わりにApp.listingCollection.fetch()
、fetchNew()
関数が使用されます。これは、新しいモデルid=5
をコレクションに追加する場合にのみ機能します。
id=5
既存のビューを再レンダリングせずに、新しいビューのみのレンダリング()をどのようにトリガーする必要がありますid=1,2,3,4
か?new ListingMarkerView({ model:item }).render();
内の行でこれを試しましたが、次の行にListingCollection
応答してエラーが発生します:var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);
ListingMarkerView
エラー
Uncaught TypeError: Object #<Object> has no method 'get'
コレクション
ListingCollection = Backbone.Collection.extend({
model: Listing,
url: '/api/search_by_bounds',
fetchNew: function(options) {
options = options || {};
var collection = this,
success = options.success;
options.success = function(resp, status, xhr) {
_(collection.parse(resp, xhr)).each(function(item) {
// added this conditional block
if (!collection.get(item.id)) {
collection.add(item, {silent:true});
new ListingMarkerView({ model:item }).render();
}
});
if (!options.silent) {
collection.trigger('reset', collection, options);
}
if (success) success(collection, resp);
};
return (this.sync || Backbone.sync).call(this, 'read', this, options);
}
});
意見
ListingMarkerView = Backbone.View.extend({
render: function() {
var marker = L.marker([this.model.get('lat'), this.model.get('lng')]);
markers.addLayer(marker);
},
close: function() {
this.unbind;
}
});