【问题标题】:Backbone fetch parent model with nested collection具有嵌套集合的主干获取父模型
【发布时间】:2013-04-19 12:11:23
【问题描述】:

我的应用程序有这样的结构:

Project (model)
     -> tracks (collection)
           -> track (model)
                 -> clips (collection)
                         clip (model)

我只需要获取父项目模型。它将导致所有数据结构的变化。我得到 JSON

{ "_id" : "123",
  "name" : "name",
  "tracks" : [ { "clips" : [ { "audioName" : "audio name",
              "audioPath" : "audio/path.wav",
              "duration" : 123,
              "id" : "track0-1"
            } ],
        "mute" : false,
        "name" : "track0",
        "selected" : false,
        "volume" : 100
      },
      { "clips" : [  ],
        "mute" : false,
        "name" : "track1",
        "selected" : false,
        "volume" : 100
      }
   ]
}

我有解析方法:

    parse: function (data) { 
        this.get('tracks').reset(data.tracks);
        delete data.tracks;
        return data;
    }

我无法解析剪辑。在模型跟踪中,属性剪辑的行为类似于 javascript 数组而不是骨干模型。

如何解析剪辑?

【问题讨论】:

    标签: node.js backbone.js model nested fetch


    【解决方案1】:

    parse 仅用于解析来自服务器的响应。因此,您将无法使用它来创建您的 clips 收藏。
    所以你可能想改变你这样做的方式(也许看看 Backbone-relational,我认为它处理这种东西)。这是一个可能的解决方案(放入您的模型中):

    initialize: function() {
      this.listenTo(this, 'change:clips', this.onChangeClips);
      // the rest of your stuff
    },
    onChangeClips: function() {
      var clips = this.get('clips');
      if(Object.prototype.toString.call(clips) === '[object Array]')
        this.set('clips', new Clips(clips), {silent: true});
    }
    

    测试 if 数组的来源:Check if object is array?

    注意:这将删除对现有集合(您似乎拥有)的任何引用,因此您可能希望在模型中保留对您的集合的引用(例如在 _clips 属性中)以使用新的clips 数组。

    【讨论】:

    • 非常感谢。这个命令:“this.set('clips', new Clips(clips), {silent: true});”是,我搜索的内容。谢谢你。现在它可以工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多