【问题标题】: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 属性分开。您在 initializesync 上更新此集合。

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

      【讨论】:

        猜你喜欢
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 2015-05-30
        • 2015-08-31
        • 2015-03-13
        相关资源
        最近更新 更多