【问题标题】:Backbone.js Collection of CollectionsBackbone.js 集合集合
【发布时间】:2012-05-10 10:03:43
【问题描述】:

我正在尝试弄清楚如何使用backbone.js 制作集合集合。我对骨干很陌生。我有类似以下情况:

 +---------------+               +------------------+
 | Playlists     |               | Playlist         |
 |---------------|          0..* |------------------|
 |               +-------------->| Name             |
 |               |               |                  |
 |               |               |                  |
 +---------------+               +-------+----------+
                                         |
                                         |
                                         |0..*
                                         v
                                 +------------------+
                                 |  Track           |
                                 |------------------|
                                 | Name             |
                                 | Artist           |
                                 |                  |
                                 +------------------+

在代码中类似于:

var trackModel = Backbone.Model.extend({
    //trackdata
});

var playlistModel = Backbone.Collection.extend({
    model : trackModel,
    url   : "playlist"
});

var playlistsModel = Backbone.Collection.extend({
    url   : "playlists",
    model : playlistModel   //This pretty sure doesn't work like I want, because there is no model attribute for collections :S
});

但是我总是在 js 控制台中收到错误提示:

 Uncaught TypeError: Object [object Object] has no method '_validate'

当我尝试执行触发验证的函数时(如添加、获取、...)

如果我将validate_validate 函数添加到任何集合或模型中没有区别。

我相信这是因为backbone.js 不支持集合中的集合。还有其他方法可行吗?

更新:

这就是现在的样子

var Track = Backbone.Model.extend({ 
    //trackdata 
}); 

var Tracks = Backbone.Collection.extend({ 
    model:Track; 
}); 

var Playlist = Backbone.Model.extend({ 
    //name  : ...
    tracks: new Tracks ()
}); 

var Playlists = Backbone.Collection.extend({ 
    url : "playlists", 
    model : Playlist 
});

【问题讨论】:

  • 看起来主干文档现在包含关于嵌套模型和集合的部分,与此处的示例非常相似:backbonejs.org/#FAQ-nested
  • 首先 - 很高兴您解决了问题。希望这将是其他一些人的答案,但是您的问题来自错误定义的数据模型-没有“播放列表”(您只有许多播放列表对象,它们被分组到一个地方),您的数据仅包含“播放列表”和“曲目”,并且有关系 1 播放列表可以有很多曲目。在您的简单(已解决)示例中,此模式非常清晰。

标签: javascript backbone.js


【解决方案1】:

您可以通过将 Playlist 从集合转换为模型来解决您的问题。如果您考虑一下,Playlist 可能还有其他无法在集合上设置的属性(例如名称)。

Playlists 将是 Playlist 模型的集合(而不是集合),它应该可以正常工作。

var Track = Backbone.Model.extend({
    //trackdata
});

var Playlist = Backbone.Model.extend({
    model : Track
});

var Playlists = Backbone.Collection.extend({
    url   : "playlists",
    model : Playlist
});

【讨论】:

  • 谢谢,似乎工作得很好:D 但是我需要一个补充集合,因为一个播放列表可以有多个轨道: var Track = Backbone.Model.extend({ //trackdata }); var Tracks = Backbone.Collection.extend({ model:Track; }); var Playlist = Backbone.Model.extend({ model : Tracks }); var Playlists = Backbone.Collection.extend({ url : "playlists", model : Playlist });我希望与服务器同步时一切正常。
  • 我不确定这种方法是否可行 - 您根本无法将 Backbone.Collection 的扩展名(即Tracks)设置为另一个集合的模型。不过,您仍然希望将Track 保留为您的Playlist.model,并且您仍然可以使用Tracks 集合来帮助促进同步。
  • 我已经更新了问题中的代码。我没有将一个集合设置为另一个集合的模型。我将收藏(曲目)设置为模型播放列表(扩展模型)的属性。如果我会像你在回答中所说的那样做:Playlist->model: track,我只能在播放列表中存储一首曲目,因为播放列表扩展了模型并且模型没有方法来收集属性模型......或者是我错了吗?
  • 现在,我在尝试从服务器获取播放列表时遇到问题。服务器对 fetch 的响应类似于以下内容:{"name":"Track Search", "mObjs":[{ "trackName":"unknown", "artistName":"unknown"}]} 问题是,Backbonejs 将 [] 解释为数组而不是集合。因此,模型播放列表的属性“tracks”将不再包含 Tracks Collection,而是一个简单的 javascript Array
  • @krial - 这是意料之中的。 Backbone 不处理关联。您要么必须使用a plugin,要么在模型的parseinitialize 方法中手动创建Collection。这可能是另一个问题的材料。
猜你喜欢
  • 2012-10-30
  • 2013-12-12
  • 2011-12-19
  • 2014-03-12
  • 2012-11-30
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多