2012-12-18 21 views
1

我在做一些非常標準的事情,我想。創建模型時的骨幹無限循環

型號:


app.model.Todo = Backbone.Model.extend({ 
    defaults: { 
     task: '' 
     , completed: 0 
     , attachments: [] 
     , note: '' 
    } 
}); 

收藏:


var Todos = Backbone.Collection.extend({ 
    model: app.model.Todo 

    , localStorage: new Store('Todos') 

    , incomplete: function() { 
     return this.filter(function (todo) { 
      return !todo.get('completed') 
     }); 
    } 

    , complete: function() { 
     return this.filter(function (todo) { 
      return todo.get('completed') 
     }); 
    } 

    , comparator: function(todo) { 
     return todo.get('order'); 
    } 
}); 

app.collection.Todos = new Todos(); 

然後,如果我只是做:

app.collection.Todos.create({task: 'hi'}); 
app.collection.Todos.create({task: 'hi'}); 

第二屆一個永遠不會奏效。我得到一個無限循環(Firefox上的遞歸和Chrome上的stack_overflow)。

我真的很茫然。我也評論了所有事件。

顯示它旋轉失控在這裏骨幹:

// Return a copy of the model's `attributes` object. 
toJSON: function(options) { 
    return _.clone(this.attributes); 
}, 

更新:如果我添加id: 0或任何ID到模型中的錯誤將停止,但如果我給它一個自定義的ID(即new Date().getTime()錯誤再次發生這就像每當我創造一個獨特的項目它炸燬

更新2:。

var todo = new gator.model.Todo({task: actionbarVal}); 
gator.collection.Todos.add(todo); 
gator.collection.Todos.sync('create', todo); 

做上述還挺工作,併爲我所需要它的作品,但它真的很糟糕。這很糟糕,因爲每次我們做一個新的添加並將其同步調用到JSON時,每次添加和同步都會在此頁面加載時調用一次。所以,如果你添加3個項目,你會得到6到JSON調用(第一個爲1,第二個爲2,第三個爲3)。而且,它不夠乾淨。我還注意到在的主幹呼叫toJSON與創建是第一次是正確的。第二次是像this.attributes ==主幹或其他東西。非常非常奇怪。它擁有Backbone的所有方法。就好像克隆做了一個很深的克隆或者其他東西。

+0

我怕我找不到'爲**型號create' **在[文件](http://backbonejs.org/#Collection-創造),它僅存在**集合**。 – Cyclone

+0

如果你在集合上調用create,似乎可以工作:http://jsfiddle.net/ambiguous/8Szgv/ PS:如果你的'defaults'中有一個數組(或其他可變對象),那麼你應該使用默認值功能而不是對象。 –

+0

@Cyclone該死的,我的錯。那是一種類型。我的意思是一個集合。固定。 –

回答

1

我最終通過恢復到Backbone的0.9.2來修復它,這要感謝Derick Bailey。我嘗試使用最新的localStorage插件似乎沒有解決它。也許我正在使用不同的來源?我用的這個開發:

https://github.com/jeromegn/Backbone.localStorage

2

您的Backbone(v0.9.9)版本與localstorage插件版本之間存在不匹配。一定要從Backbone repo獲取最新版本的localstorage插件,它會解決這個問題。