2012-05-10 61 views
6

什么时候适合过滤一个集合与在Backbone中有多个集合?过滤集合与Backbone中的多个集合?

例如,考虑一个音乐库应用程序。它可以显示流派和用于显示所选流派音乐的另一个视图。

你想让所有的音乐制作一个巨大的集合,然后过滤它或几个较小的音乐?

只有一个集合允许您添加其他属性进行筛选的功能,但假设您有大量音乐:如何防止在应用程序启动时全部加载它,如果用户只需要1类型?

回答

4

我认为最简单的方法是有一个共同的独特集合,智,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(); 
+0

这听起来很诱人,但如果我需要添加另一个搜索过滤器,比如说艺术家的名字怎么办?我如何告诉服务器in/songs/elvis这个参数是一个艺术家的名字,但是它/歌曲/摇滚是什么类型? (是的,我是一个完全休息小白) – wannabeartist

+2

你可以通过几种方法做到这一点。首先是每个人都有独立的端点,所以你会有/歌曲/艺术​​家/猫王和/歌曲/流派/摇滚。另一种方法是使用查询字符串参数,所以你可以有/歌曲/?艺术家=猫王和流派=摇滚。我的首选是第一个选项,因为它提供了更清晰的URL。 – Mun

+0

谢谢澄清! – wannabeartist

1

这主要是一个设计选择,但我的投票将选择一个方案,松散地反映存储集合的数据库。

如果您可能将数据存储在SQL数据库中,那么songsgenres将更有可能没有单独的表。您可能需要通过歌曲表中的genre_id列连接它们,或者根据单独的连接表(如果歌曲可以有多个类型)连接它们。因此,您可能需要分别代表流派和其中的歌曲。在这种情况下,backbone-relational可能是帮助保持直线的非常有用的工具。

如果您将信息存储在任何类型的关系/键值/文档存储中,则直接将该类型与该歌曲直接存储并进行相应的过滤可能是有意义的。在这种情况下,您最终可能会以您可以直接访问歌曲(例如,通过songs)或流派(例如,genre:genre_id/songs)来存储您的文档密钥/查询。如果这是你走的路线,那么简单地创建一个庞大的歌曲集并计划在应用程序和数据库环境中设置相应的过滤器可能会更方便。

+0

感谢,那些听起来像了坚实的论据作出选择 – wannabeartist