1

fetchイニシャルの後に(ユーザーのアクションに応答して)aが呼び出されるとfetch、新しくフェッチされたモデルの多くは、イニシャルの既存のモデルと同様になる可能性がありますfetch。オプションを指定して呼び出すfetchadd: true、コレクションに重複するモデルが存在する可能性があります。

問題:コレクションから既存のすべてのモデル(たとえばwith id=1,2,3,4)を削除し、新しくフェッチされたモデル(id=1,2,3,5)を挿入する代わりに、次の2つの操作を実行できます。

  1. 新しいモデルのみを追加するid=5と、コレクションが作成されid=1,2,3,4,5ます。次に、新しいビューのみをレンダリングします(id=5

  2. 新しいモデルを追加し、新しい( )id=5にないモデルを削除します。次に、新しいビュー()をレンダリングし、古いビュー( )を削除しますfetchid=4id=5id=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;
    }

});
4

1 に答える 1

3

Restful APIには、話しているクライアントの状態の概念がないため、GETオブジェクトのリストを取得するように要求する場合(http://example.com/restapi/user/など)、RESTサーバーは常に完全なものを返す必要があります。一致するオブジェクトのリスト。

バックボーン側では.reset、サーバーからのリストを含むコレクションだけを取得する必要があります。 .resetコレクションを空にしてから、次のようなすべてのアイテムを追加します。

my_collection.fetch({success: function(collection, resp){ 
    collection.reset(resp, {silent: true});
}});

これにより、衝突が発生せず、何も心配する必要がありません。サーバーに保存されていない、ローカルで変更したモデルがある場合を除きます。

コレクション内のローカルアイテムの変更を防ぐ方法を探している場合は、上記で話している魔術のようなものが必要になります。

于 2012-09-29T17:18:19.680 に答える