2012-06-04 60 views
2

我有一個骨幹集合骨幹Collection.reset()不能在擴展集工作

jQuery -> 
    class App.Collections.List extends Backbone.Collection 
    model: App.Models.ListItem 

我想初始化頁面加載的集合:

var list = new App.Collections.List; 
list.reset(<%= @data.to_json.html_safe %>) 

這將引發JS主幹庫中的錯誤。

Uncaught TypeError: undefined is not a function application.js:597 
f.extend._prepareModel application.js:597 
f.extend.add application.js:591 
f.extend.reset application.js:595 
(anonymous function) 

但是,如果我的代碼更改爲:

var list = new Backbone.Collections; 
list.reset(<%= @data.to_json.html_safe %>) 

復位工作,並收集填充 - 認爲在集合中的對象似乎不知道他們應該是ListItem對象。我是否必須爲所有重設我的自定義集合做一些特別的事情?

+0

工作對我來說,只要我能重現您的設置:http://jsfiddle.net/LXW6h/ – nikoshr

+0

模型和收集加載順序不正確。請參閱Derick的回答以及我對hom的後續評論。 – empire29

回答

7

_prepareModel stacktrace行提示您在收集後聲明瞭模型。

你最有可能你的代碼中設置了這樣的:


    class App.Collections.List extends Backbone.Collection 
    model: App.Models.ListItem 

    class App.Models.ListItem extends Backbone.Model 

這是要失敗的,因爲ListItem當您嘗試在您的收藏的model屬性來使用它尚未宣佈。您基本上將模型屬性設置爲undefined

您需要首先聲明型號:


    class App.Models.ListItem extends Backbone.Model 

    class App.Collections.List extends Backbone.Collection 
    model: App.Models.ListItem 

請注意,這不是在CoffeeScript中或骨幹的限制。這是使用對象文字引起的JavaScript行爲。對象文字鍵/值對的值將立即進行評估,這意味着它必須存在,否則將返回未定義或拋出的其他錯誤。

+0

謝謝,那就是問題所在。我已經把集合放在模型上面的集合上面,因爲我試圖建模一個嵌套列表,所以我的ListItem模型有一個屬性「children」,它是一個App.Collections.List ...我假設使用關係骨幹模塊將是我最好的最好的實現這一目標? – empire29

+0

Backbone可能讓你指定一個函數作爲'model'屬性......'App.Collections.List = Backbone.Collection.extend({model:function(){return MyModelType;});'這不會受制於同樣的限制,因爲函數將在運行時在訪問'model'屬性時執行。 –

0

正如德里克說,你首先需要聲明的模型,用於該目的只是我通常只需要更改順序App.coffee(主要骨幹文件)到這個

... 
require_tree ./models 
require_tree ./collections 
...