1

我使用Backbone.localStorage並具有以下集合:無法在Backbone.localStorage插件設置初始收集數據

var PlayersCollection = Backbone.Collection.extend({ 
    model: Player, 
    localStorage: new Backbone.LocalStorage("players-backbone"), 
}); 

,並試圖通過設置初始數據:

var col = new PlayersCollection([ 
    { 
    "model": "myapp.person", 
    "pk": 1 
    }, 
    { 
    "model": "myapp.person", 
    "pk": 2 
    } 
]); 

但不幸的是我沒有收集上述物品:

col.localStorage.records // [] nothing 

我怎麼能itialize基於初始收集數據的localStorage商店?

+0

我假設Backbone.LocalStorage是https://github.com/jeromegn/Backbone.localStorage? –

+0

是的。只是在帖子 – Erik

+0

@Erik中添加你既不保存也不取回你的模型,所以你的存儲不應該擔心任何方式。你期望一個自動同步? – nikoshr

回答

2

好吧,首先想到的是Backbone.LocalStorage只通過'同步'請求加載數據的事實。這意味着即使在localStorage中存在數據,您也需要在將數據設置到集合中之前調用col.fetch()。

對於您的具體示例,此解決方案就足夠了。然而,它有它自己的一套需要注意的地方,我很樂意來解決,如果你能在你的需求擴大:

var PlayersCollection = Backbone.Collection.extend({ 
    localStorage: new Backbone.LocalStorage("players-backbone"), 
    initialize: function(){ 
     // NOTE: Models are NOT set on Collection in initialize. Defer until ready. 
     _.defer(function(){ 
      if(!this.isEmpty()){ 
       this.invoke('save'); 
       this.fetch(); 
      } 
     }.bind(this)); 
}); 

var col = new PlayersCollection([ 
    { 
    "model": "myapp.person", 
    "pk": 1 
    }, 
    { 
    "model": "myapp.person", 
    "pk": 2 
    } 
]); 

col.once('sync', function(){ 
    console.log('col:', col.localStorage.records); 
}); 

顯然,這裏的主要問題是:

  • 事件驅動初始化這是不直觀的。這可以通過建立一個負責創建PlayersCollection的工廠來解決,或者通過向集合提供另一種需要在初始化之後運行的方法來解決。所有的解決方案都有點醜陋。

  • 修改現有的localStorage數據。通過告訴集合在加載時保存,你將最終修改localStorage中已有的東西。這可以通過檢查一個空集合來解決。但是,您可能仍然有一些意想不到的結果。

但是,我主要關心的是,爲什麼你需要從localStorage中取出,當你的集合已經被賦予它的模型。爲什麼不直接訪問col中的模型而不是詢問其記錄?

相關問題