2012-05-10 60 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