2013-10-25 187 views
2

對骨幹JS來說很新穎,我需要知道在模型中的集合中的模型上循環和設置屬性的「正確」方式。在嵌套集合中設置模型中的骨幹屬性

我的模式是這樣的:

var mediaItem = Backbone.Model.extend({ 
}); 

var mediaItems = Backbone.Collection.extend({ 
    model: mediaItem 
}); 

var story = Backbone.Model.extend({ 
    initialize: function() { 
     this.MediaItems = new mediaItems(this.get('MediaItems')); 
     this.MediaItems.parent = this; 
    } 
}); 

我想要做的就是通過MediaItems迴路在給定的故事,並設置每個的寬度和高度。如果我不喜歡這樣......

storyInstance.MediaItems.each(function (mediaItem) { 
          mediaItem.set('Width', 200); 
          mediaItem.set('Height', 100); 
        }); 

...那麼storyInstance.MediaItems屬性中的MediaItem模型正確更新,但storyInstance.attributes.MediaItems中的對象都沒有。當我隨後在Story模型中調用JSON()時,就會使用屬性樹。

我可以修改上面的代碼來循環顯示屬性,但是我覺得我已經設置了錯誤的模型,或者有一個更標準的方法來做到這一點?

謝謝。

+0

是的,別的是錯的 - 調用'set'應該更新屬性。你在這裏指的是什麼:「MediaItems屬性中的模型」?我在代碼中看不到那部分內容。 – McGarnagle

+0

我剛剛給Ravi Hamsa的回答添加了一些評論 - 希望這有助於解釋? – Fijjit

回答

0

可能初始化的東西不是您所期望的。

下面的代碼

var story = Backbone.Model.extend({ 
    initialize: function() { 
     this.MediaItems = new mediaItems(this.get('MediaItems')); 
     this.MediaItems.parent = this; 
    } 
}); 

應該已經

var story = Backbone.Model.extend({ 
    initialize: function() { 
     this.MediaItems = this.get('MediaItems'); 
     this.MediaItems.parent = this; 
    } 
}); 

和實例項目應與故事模式的實例來完成像

var storyInstance = new story({ 
    MediaItems: new mediaItems() 
}) 

然後

story.MediaItems.each(function (mediaItem) { 
         mediaItem.set('Width', 200); 
         mediaItem.set('Height', 100); 
       }); 

會導致更新兩個

+0

感謝您的回覆。我使用fetch來填充Story模型,如果我使用上面的代碼,那麼storyInstance.Mediaitems將成爲MediaItem模型的數組,而不是MediaItems集合,這意味着我無法使用它們遍歷它。 – Fijjit

+0

如果我堅持使用「new mediaItems(this.get('MediaItems'))」,那麼MediaItems被設置爲一個集合,我可以使用它們,但是如果我設置了寬度/高度,那麼story.MediaItems中的模型是正確更新,但story.attributes.MediaItems中的對象不會更新 - 而且它的這些對象似乎在我運行story.getJSON時使用。 – Fijjit

+0

您是否嘗試過使用此代碼?當我設置一個屬性時,我設置了一個集合,當存儲與this.MediaItems相同時將通過引用傳遞,這裏沒有對數組的轉換。 –

0

編輯:沒有意識到這是從'13。它出現在標籤backbone.js的問題中,我直到現在才注意到日期/時間。

嘗試在初始化部分檢查Array的實例。

var story = Backbone.Model.extend({ 
    initialize: function() { 
     if(this.get('MediaItems') instanceof Array){ 
      this.MediaItems = new mediaItems(this.get('MediaItems')); 
     } 
     else { 
      this.MediaItems = this.get('MediaItems'); 
     } 

     this.MediaItems.parent = this; 
    } 
});