2012-03-07 22 views
1

下面是官方的示例應用程序:Backbone.js的和localStorage的插件的關係 - 「待辦事項」例如根據官方

http://documentcloud.github.com/backbone/docs/todos.html

我感到困惑的收集和其屬性之間的關係​​

不應該這是在model,因爲你不能做一個collection.save()呢?

此外,我試圖實現類似的東西,它不工作

var Person = Backbone.Model.extend({ 
     defaults: { 
      name:'no-name', 
      age:0 
     } 
}); 


var Persons = Backbone.Collection.extend({ 
     model: Person, 
     localStorage: new Store('Persons'), 
     initialize: function(){ 
      console.log('collection initialized'); 

     } 
}); 

window.people = new Persons(); 

var p1 = new Person({name:'JC',age:24}); 
p1.save({text:'hello'}); //<--- Uncaught TypeError: Cannot read property 'localStorage' of undefined 

誰能幫我想出解決辦法?

回答

6

它實際上是一個允許集合「保存」到localStorage的集合的.create()函數。

source-code of todo sample:

createOnEnter: function(e) { 
     var text = this.input.val(); 
     if (!text || e.keyCode != 13) return; 
     Todos.create({text: text}); 
     this.input.val(''); 
    }, 

這便於模型實例使用.save({attr:value})功能來操縱它。

調用modelInstance.save()沒有模型的構造函數定義localStorage屬性將導致錯誤:

Uncaught TypeError: Cannot read property 'localStorage' of undefined

然而,作爲該模型是現在通過collectionInstance.create()方法保存在本地存儲,現在可以使用modelInstance.save({attr:value})來修改它。

因此,總之,模型只有save()函數允許持久性,但Collection對象具有允許持久性的create()函數。

爲了使用這些,收集和模型中REST URL必須正確設置或localStorage的插件必須(根據設置)的構造函數

+0

就像詢問如何檢索使用本地存儲存儲的數據?我試過this.collection.fetch(),但它不起作用 – jongbanaag 2012-04-26 05:23:22

+0

另外,如果我想更新?會有可能嗎?因爲我將刪除的東西,然後我想收集後關閉應用程序更新 – jongbanaag 2012-04-26 05:57:28

+0

因此,它可以安全地說,backbone.localStorage實際上不是一個替代Backbone.sync的下降? – loxyboi 2015-01-19 14:56:15

-1

我有類似的問題中被實例化我想簡單地'保存'我從LocalStorage加載的集合。我在我的集​​合上寫了一個save()方法,它簡單地遍歷每個模型並稱爲model.save()。

MyCollection.save = -> 
    @each (model) -> 
     model.save() 

但是,對於Backbone.LocalStorage有一個很大的缺點。你放棄使用Collection.set({models ...})的所有優點;用所有的添加/合併/刪除善良來更新你的收藏(拉入在線更新或其他)。在運行時從集合中刪除模型不會將其從本地存儲中刪除,並且手動標識不匹配的模型並銷燬它們會有損Backbone.Collection.set()的用途。

我發現的一個解決方案是增強Backbone,使Backbone.Collection.set()在它發現缺失的模型上使用destroy()而不是remove()。 (見BB 1.0的第705行。0)

另外一個解決方案,就是讓所有模型都傾聽他們自己的「刪除」事件,並在事件發生時調用他們自己的「銷燬」方法。這使Backbone.Collection.set()的刪除成爲永久的。

class Model extends Backbone.Model 
    initialize: -> 
    @on 'remove', @destroy 

這兩個都意味着你不能「刪除」一個模型而不會永久摧毀它,這對我來說很好。如果你願意,你可能會創建一些特殊的條件,並以這種方式進行管理。