假设我有一个Web应用程序,它允许过滤一组项目,并说我在web前端使用backbone.js。
很自然地,我最终创建了一个过滤器,它扩展了 Backbone.Model 和 SearchResultList ,扩展了 Backbone.Collection 。过滤器有一些属性,如 searchTerm , dataFrom , dateTo ...过滤器也有一个名为applyFilter
的方法。 Filter.applyFilter
应致电searchResultList.fetch
,从而更新/过滤搜索结果。
问题是,如何最好地将searchResultList
初始化为Filter
的属性,而不是在Backbone条款中作为属性?
我不想在SearchResultList
中创建Filter.initialize
因为SearchResultList
Filter
不一定“拥有”。
现在我最终将searchResultList
对象作为option
传递给Filter.initialize
,但这对我来说有点尴尬。
我怀疑让Filter.applyFilter
致电SearchResultList.fetch
是个好主意。但是,需要一种Filter
方法,当被调用时会以某种方式触发新请求。 (听取Filter
的更改事件不是一个选项,因为用户应该在多个步骤中更改过滤器选项,并决定通过按钮单击手动应用过滤器)
答案 0 :(得分: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");