2013-10-25 184 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; 
    } 
});