2013-09-24 120 views
0

說我有一個Web應用程序,它允許過濾一組項目,並說我在web前端使用backbone.js。如何將Backbone.Collection定義爲屬性,但不是Backbone.Model的屬性?

很自然,我結束了創建一個過濾延伸Backbone.Model和擴展Backbone.Collection一個SearchResultList。該過濾器具有類似SEARCHTERMdataFromdateTo ...過濾器也有一個名爲applyFilter方法的某些屬性。 Filter.applyFilter應該調用searchResultList.fetch,從而更新/過濾搜索結果。

的問題是,如何以最佳方式初始化searchResultList財產Filter,而不是作爲一個屬性骨幹方面?

我不想在Filter.initialize中創建SearchResultList,因爲SearchResultList不一定由Filter「擁有」。

現在我最終通過searchResultList對象作爲optionFilter.initialize,但這對我來說有點尷尬。

我懷疑讓Filter.applyFilter致電SearchResultList.fetch是個好主意。但是,需要有一種方法Filter,它在被調用時以某種方式觸發新的請求。 (聆聽Filter的更改事件不是一種選擇,因爲用戶應該多步更改過濾器選項,並決定通過單擊按鈕手動應用過濾器)

回答

0

我有一個執行搜索的集合。我的大部分藏品擴展了這個搜索集合。

它有一個對象,其中包含用於搜索的參數。該集合的用戶可以撥打setSearchParam,我有一個方法buildSearchString,它將構建要調用的URL的搜索部分(我在我的REST URL中使用Matrix參數)。

window.SearchCollection = Backbone.Collection.extend({ 

    initialize : function() { 
    this.params = {}; // holds parameters for searching 
    }, 

    // Set a search param 
    setSearchParam: function(param, value) { 
    if (typeof value === 'undefined') return; 
    if (typeof this.params === 'undefined') this.params = {}; 

    this.params[param] = value; 
    }, 

    setSearchParams : function(paramMap) { 
    _.extend(this.params, paramMap); 
    }, 

    // Build Matrix params for search. This could just as easily be a standard URL string 
    buildSearchString: function() { 
    var search = []; 
    var i = 0; 

    for (var key in this.params) { 
     var value = this.params[key]; 
     if (utils.isEmpty(value)) continue; 

     search[i++] = ";"; 
     search[i++] = key; 
     search[i++] = "="; 
     search[i++] = value; 

    } 
    return search.join(''); 
    } 
}); 

後來,當我創建一個集合,我擴展它:

window.BookingCollection = window.SearchCollection.extend({ 
    model: Booking, 

    url: function(){ 

     var urlString = BASE_REST_URL + "bookings/"; 

     // Build the matrix params for the REST URL 
     urlString += this.buildSearchString(); 

     return urlString; 
    } 

}); 

然後,這個集合的用戶可以使用它像這樣:

var bookings = new BookingCollection(); 
bookings.setSearchParam("name", "hello"); 
相關問題