【问题标题】:Saving a Backbone model where i've created a collection inside保存我在其中创建集合的主干模型
【发布时间】:2015-02-23 06:15:45
【问题描述】:
我有一个名为“播放列表”的模型,我从服务器返回,其中包含一个名为“视频”的对象数组。当我从服务器获取“播放列表”数据时,我需要将“视频”转换为集合。我有时会更新“视频”集合中的模型。现在当我去保存“播放列表”模型时,是否会因为我将“视频”属性设置为集合而出现问题?在保存之前是否需要将其转回原始项目数组?
如果有人能给我任何关于这种情况下最佳模式的提示,那就太好了。也许我应该创建一个单独的集合并单独保留播放列表的“视频”属性,当我去保存播放列表模型时,我可以使用该集合的原始副本覆盖播放列表的视频属性。
【问题讨论】:
标签:
design-patterns
backbone.js
collections
model
【解决方案1】:
....会有问题吗,因为我已将“视频”属性设置为
一个集合?
是的,会的。正如您所说,您需要在发送之前对集合进行序列化。
我认为最好的方法是拥有一个作为主干集合的属性,与您的videos 属性分开。您在 initialize 和 sync 上更新此集合。
您将只使用videos 属性作为填充您的集合的一种方式。
我的建议是在您的 Playlist 模型中覆盖 Backbone 的 save 方法来序列化您的视频收藏。一旦你序列化你的集合,你就可以将模型保存回 Backbone 保存方法。
Model.Playlist = Backbone.Model.extend({
initialize: function(options){
this.initializeVideoCollection();
this.on('sync', this.initializeVideoCollection, this);
},
initializeVideoCollection: function(){
this.videoCollection = new Collections.VideoCollection(this.get('videos'));
},
save: function(attrs, options){
attrs = attrs || this.toJSON();
attrs.videos = this.videoCollection.toJSON();
options.attrs = attrs;
return Backbone.Model.prototype.save.call(this, attrs, options);
}
});
【解决方案2】:
我对此的解决方案通常是根据需要公开集合。换句话说,您的模型应该仅在有人明确需要时创建集合:
Model.Playlist = Backbone.Model.extend({
getVideosCollection: function() {
if (!this._videos) {
this._videos = new Collections.VideoCollection(this.get('videos'));
// If people will be making changes to the videos,
// you can keep the local data synchronized easily.
this.listenTo(this._videos, 'add change remove', this._updateVideos);
}
return this._videos;
}
// Method called when the externally-shared collection is
// modified
_updateVideos: function() {
this.set('videos', this._videos.toJSON());
}
});
这样,您的 Backbone 解析和保存结构的其余部分保持不变。