保存Backbone模型,我在里面创建了一个集合

时间:2015-02-23 06:15:46

标签: design-patterns backbone.js collections model

我有一个名为'播放列表'的模型我从服务器回来了,它有一组叫做'视频'的对象。当我从服务器获取“播放列表”数据时,我需要将“视频”转换为集合。我有时会在'视频'集合中更新模型。现在,当我去保存“播放列表”模型时,是否会出现问题,因为我已将“视频”属性设置为集合?在保存之前,我是否需要将其重新转换为原始数组?

如果有人能给我任何有关这种情况的最佳模式的提示,那将是好的。也许我应该创建一个单独的集合并单独保留播放列表的“视频”属性,当我去保存播放列表模型时,我可以使用集合的原始副本覆盖播放列表的视频属性。

2 个答案:

答案 0 :(得分:1)

  

....会有问题,因为我已将'videos'属性设置为   收藏品?

是的会有。如您所说,您需要在发送之前序列化集合。

我认为最好的方法是拥有一个Backbone Collection属性,与您的videos属性分开。您在initializesync上更新了此集合。

您只能使用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解析的其余部分&保存结构保持不变。