2012-01-24 96 views
4

我有一個可能包含數千個模型的集合。我有一個視圖,每個頁面顯示一個包含50行的表格。backbone.js緩存集合和刷新

現在我想能夠緩存我的數據,以便當用戶加載表1的頁面,然後單擊頁面2時,頁面1(行#01-50)的數據將被緩存,以便當用戶再次點擊頁面1,骨幹不必再次獲取它。因爲RESET會刪除集合中的所有模型,包括可能存在於我的應用程序中的現有模型的引用,所以我希望我的集合能夠從服務器刷新更新的數據而不執行RESET。是否可以從服務器獲取數據,並且只需要通過比較現有數據和新到達數據來更新或添加新模型?

回答

7

在我的應用程序,我加入fetchNew稱爲新的方法來解決復位問題:

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); 
    } 

}); 

這是相當多的標準fetch()方法相同,除了條件語句檢查項目的存在,默認使用add(),而不是reset。與簡單地在options參數中傳遞{add: true}不同,它允許您檢索可能與已加載內容重疊的模型組 - 使用{add: true}將嘗試添加同一模型兩次時會引發錯誤。

這應該可以解決您的緩存問題,假設您的收藏已設置好,以便您可以通過options中的某種page參數告訴服務器要發回的選項頁面。你可能會想增加你的收藏中的某種數據結構來跟蹤已加載的網頁,以避免不必要做的要求,如:

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中的項目將被添加到集合中。

至於你的第二種情況,目前沒有內置的方法來做到這一點。

According to Jeremy這是你應該在你的應用程序中做的事情,而不是Backbone的一部分。

當用於協作應用程序時,骨幹似乎有許多問題,其中另一個用戶可能正在更新您擁有客戶端的模型。我感覺Jeremy似乎專注於單用戶應用程序,而上面的票證討論就是例證。

對於您的情況,處理第二種情況的最簡單方法是迭代您的集合並在每個模型上調用fetch()。但是,這對性能不是很好。

爲了更好地實現這個目標,我認爲你將不得不重寫collection._add,然後在dalyon上做這個pull request

+0

感謝您鏈接到拉取請求 – peter

1

我設法得到update骨幹核心0.9.9 。檢查它,因爲它正是你需要的http://backbonejs.org/#Collection-update

+0

缺少文檔。我找不到它 – Muhaimin

+0

從1.0.0開始'Collection#update'已被重命名爲'Collection#set'。 –