【发布时间】:2012-05-10 17:02:28
【问题描述】:
什么时候过滤一个集合而不是在 Backbone 中有多个集合?
例如,考虑一个音乐库应用。它会有一个显示流派的视图和另一个显示所选流派音乐的视图。
您更愿意用所有音乐制作一个庞大的集合然后过滤它还是几个较小的?
只有一个集合可以让您添加用于按其他属性过滤的功能,但假设您有大量音乐:如果用户只需要一种类型,您如何防止在应用程序启动时将其全部加载?
【问题讨论】:
标签: backbone.js
什么时候过滤一个集合而不是在 Backbone 中有多个集合?
例如,考虑一个音乐库应用。它会有一个显示流派的视图和另一个显示所选流派音乐的视图。
您更愿意用所有音乐制作一个庞大的集合然后过滤它还是几个较小的?
只有一个集合可以让您添加用于按其他属性过滤的功能,但假设您有大量音乐:如果用户只需要一种类型,您如何防止在应用程序启动时将其全部加载?
【问题讨论】:
标签: backbone.js
我认为最简单的方法是拥有一个通用的唯一集合,智能地,fetch 一个已经按流派过滤来自服务器的数据:
// code simplified and no tested
var SongsCollection = Backbone.Collection.extend({
model: Song,
url: function() {
return '/songs/' + this.genre;
},
initialize: function( opts ){
this.genre = opts.genre;
}
});
var mySongsCollection = new SongsCollection({ genre: "rock" });
mySongsCollection.fetch();
您必须让此集合在用户更改所选类型时从服务器重新获取数据:
mySongsCollection.genre = "punk";
mySongsCollection.fetch();
【讨论】:
这主要是一个设计选择,但我的投票是选择一个松散地反映存储集合的数据库的方案。
如果您可能将数据存储在 SQL 数据库中,您很可能会为 songs 和 genres 提供单独的表。您可能会通过歌曲表中的genre_id 列连接它们,或者(如果歌曲可以有多个流派)根据单独的song_genres 连接表连接它们。因此,您可能需要单独的集合来代表流派和其中的歌曲。在这种情况下,backbone-relational 可能是非常有用的工具,可以帮助他们保持正确。
如果您将信息存储在任何类型的关系/键值/文档存储中,那么直接将流派与歌曲一起存储并进行相应过滤可能是有意义的。在这种情况下,您最终可能会以这样一种方式存储文档键/查询,以便您可以直接访问歌曲(例如,通过 songs)或通过流派(例如,genre:genre_id/songs)访问歌曲。如果这是你走的路,那么简单地创建一个庞大的歌曲集合并计划在应用程序和数据库环境中设置相应的过滤器可能会更方便。
【讨论】: