2012-01-24 18 views
4

私は数千のモデルを潜在的に含むコレクションがあります。私は、各ページに50行のテーブルを表示するビューを持っています。backbone.jsキャッシュのコレクションとリフレッシュ

これで、ユーザーが表の1ページ目をロードして2ページ目をクリックすると、1ページ目(行#01-50)のデータがキャッシュされるようにデータをキャッシュできるようになりました。ユーザーがページ1を再度クリックすると、バックボーンは再びページをフェッチする必要はありません。

また、RESETを実行することなくサーバーから更新されたデータをリフレッシュできるようにするため、RESETはコレクション内のすべてのモデルを削除します。既存のデータと新しい到着データを比較することによって、サーバーからデータをフェッチし、必要に応じて新しいモデルを更新または追加することは可能ですか?

答えて

7

、私はfetchNewと呼ばれる新しいメソッドを追加することにより、リセットの質問に対処:これはアイテムの存在を確認する条件文を除いて、ほとんど同じ標準fetch()方法にある

app.Collection = Backbone.Collection.extend({ 

    // fetch list without overwriting existing objects (copied from fetch()) 
    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}); 
       } 
      }); 
      if (!options.silent) { 
       collection.trigger('reset', collection, options); 
      } 
      if (success) success(collection, resp); 
     }; 
     return (this.sync || Backbone.sync).call(this, 'read', this, options); 
    } 

}); 

、およびresetではなく、add()をデフォルトで使用します。 {add: true}を単に引数optionsに渡すのとは異なり、すでにロードしたモデルと重複する可能性のあるモデルのセットを取得することができます。同じモデルを2回追加しようとすると、{add: true}を使用するとエラーがスローされます。

これは、パラメータの何らかの種類をoptionsに渡すことができるように、コレクションが設定されていると仮定して、キャッシュする問題を解決するはずです。

app.BigCollection = app.Collection.extend({ 

    initialize: function() { 
     this.loadedPages = {}; 
    }, 

    loadPage: function(pageNumber) { 
     if (!this.loadedPages[pageNumber]) { 
      this.fetchNew({ 
       page: pageNumber, 
       success: function(collection) { 
        collection.loadedPages[pageNumber] = true; 
       } 
      }) 
     } 
    } 

}); 
7

Backbone.Collection.fetchには、コンテンツを置き換える代わりにモデルをコレクションに追加するオプション{add:true}があります。

myCollection.fetch({add:true}) 

したがって、最初のシナリオでは、page2のアイテムがコレクションに追加されます。

第2のシナリオでは、現在のところ、これを行う方法はありません。

According to Jeremyこれは、あなたのアプリでやるべきことであり、バックボーンの一部ではありません。

バックボーンには、他のユーザーがクライアント側のモデルを更新しているコラボレーションアプリに使用されているときに、いくつかの問題があるようです。 Jeremyがシングルユーザーアプリケーションに焦点を当てているような気がします。上記のチケットディスカッションでは、その例を示しています。

あなたのケースでは、2番目のシナリオを処理する最も簡単な方法は、コレクションを反復し、各モデルにfetch()を呼び出すことです。しかし、それはパフォーマンスにとってあまり良いことではありません。

これを行うには、collection._addをオーバーライドして、ダーリンソン氏が行った行をこのpull requestにする必要があると思います。私のアプリで

+0

プルリクエストへのリンクありがとう – peter

1

私はバックボーン0.9.9コアにupdateを得ることができた:あなたはおそらく、例えば、不要な要求を行うことを避けるために、あなたがロードされてきたページを追跡するためにあなたのコレクション内のデータ構造のいくつかの並べ替えを追加することをお勧めします。それがちょうどあなたが必要とするものを確認してくださいhttp://backbonejs.org/#Collection-update

+0

ありがとうございました。私はそれを見つけることができません – Muhaimin

+0

1.0.0から 'Collection#update'は' Collection#set'に名前が変更されました。 –

関連する問題