我有一个名为'播放列表'的模型我从服务器回来了,它有一组叫做'视频'的对象。当我从服务器获取“播放列表”数据时,我需要将“视频”转换为集合。我有时会在'视频'集合中更新模型。现在,当我去保存“播放列表”模型时,是否会出现问题,因为我已将“视频”属性设置为集合?在保存之前,我是否需要将其重新转换为原始数组?
如果有人能给我任何有关这种情况的最佳模式的提示,那将是好的。也许我应该创建一个单独的集合并单独保留播放列表的“视频”属性,当我去保存播放列表模型时,我可以使用集合的原始副本覆盖播放列表的视频属性。
答案 0 :(得分:1)
....会有问题,因为我已将'videos'属性设置为 收藏品?
是的会有。如您所说,您需要在发送之前序列化集合。
我认为最好的方法是拥有一个Backbone Collection属性,与您的videos
属性分开。您在initialize
和sync
上更新了此集合。
您只能使用videos
属性来填充您的收藏。
我的建议是在save
模型中覆盖Backbone的Playlist
方法,以序列化您的视频集。将序列序列化后,将模型保存回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);
}
});
答案 1 :(得分:1)
我的解决方案通常是根据需要公开集合。换句话说,只有当有人明确需要时,您的模型才应创建集合:
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解析的其余部分&保存结构保持不变。