2013-07-07 87 views
0

我目前正在與backbone.js混戰並且遇到一些嘗試在模型和集合之間創建一些關係的奇怪行爲。從模型中檢索骨幹集合並將其保存爲集合

因此,這裏是我的型號/系列

Element = Backbone.Model.extend({ 
    name: 'element' 
}); 

Elements = Backbone.Collection.extend({ 
    name: 'elements', 
    model: Element 
}); 

Application = Backbone.Model.extend({ 
    name: 'app', 
    initialize: function() { 
    this.elements = new Elements(this.get('elements')); 
    } 
}); 

當我通過application.get('elements')檢索元素,我收到了「false」詢問是否這個新對象是一個instanceof Backbone.Collection

var gotElements = application.get('elements'); 
var isCollection = gotElements instanceof Backbone.Collection; 

所以我做錯了什麼,或者我必須創建一個新的集合實例和與我從應用程序接收收集填滿它?

回答

4

在你的初始化函數做this.elements將名爲直接在模型「元素」(這樣model.elements將是您的收藏骨幹)財產。問題是當你試圖通過調用application.get('elements')來檢索this.elements時,你會看到它返回undefined(這就是爲什麼它不是Backbone集合的一個實例)。

爲了使模型屬性使用它需要與model.set(屬性)設定model.get爲檢索。如果您在控制檯中檢查模型,您將看到不同之處。 model.set(myData)將您的數據添加到模型的屬性哈希。 model.myData = myData將'myData'屬性直接添加到模型中。

爲了得到這個工作,你可以做到以下幾點:

Element = Backbone.Model.extend({ 
    name: 'element' 
}); 

Elements = Backbone.Collection.extend({ 
    name: 'elements', 
    model: Element 
}); 

Application = Backbone.Model.extend({ 
    name: 'app', 
    elements: null 
}); 

var application = new Application({ 
    elements: new Elements() 
}); 

var myElements = application.get('elements'); 

myElements現在應該是一個空的骨幹收集

+0

謝謝mcbex!我沒有像以前那麼困惑。根據我的實際問題,你的答案完全正確。我試圖在服務器和客戶機上重用我的應用程序的模型和確切狀態,但它似乎保持同步更像是一種迷惑,而不是它可以帶來的好處。 – Alx

0

而不是把你收集到另一個模型,你應該把它放在根據視圖:

var ListView = new Backbone.View.extend({ 
    initialize:function(){ 
     this.Elements= new Elements(); 
     // more stuff to go 
    }, 
    render:function(){ 
      _.forEach(this.Elements, function(){ 
     //Do rendering stuff of indivdual elements and get HTML 
     }); 
     //put HTML in the DOM 
    } 
}); 

沒有必要含含幾種模式集合的模式。

編輯:而不是把你的應用程序放入模型,你應該把它放到一個視圖。

+0

但後來,其中的數據(模型)和UI(視圖)之間的分離?我希望在客戶端有一個表示整個應用程序狀態的「對象」,因此將其放入視圖中並不合適,因爲我不能簡單地將視圖替換爲讓我們說更詳細的視圖來顯示更多的屬性的模型。 – Alx

+0

是的,你是對的。如果你想分開重複使用你的集合,把它連接到一個視圖是沒有意義的。我的方法是針對簡單的情況,即每個集合只有一個視圖。 –

+0

非常感謝Lilith2k3,現在有道理;) – Alx