2013-09-24 48 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");