0

假设我有一个允许过滤一组项目的 Web 应用程序,并说我在 Web 前端使用了主干.js。

很自然地,我最终创建了一个扩展Backbone.Model的过滤器和一个扩展Backbone.Collection的SearchResultList。Filter 有一些属性,比如searchTermdataFromdateTo ... Filter 也有一个名为 的方法。应该调用,从而更新/过滤搜索结果。applyFilterFilter.applyFiltersearchResultList.fetch

问题是,如何最好地初始化searchResultList属性Filter不是Backbone 术语中的属性?

我不想创建SearchResultListinFilter.initialize因为SearchResultList不一定由Filter.

现在我最终将searchResultList对象作为optionto传递Filter.initialize,但这对我来说有点尴尬。

我怀疑让Filter.applyFiltercall是个好主意SearchResultList.fetch。但是,需要有一种方法Filter,当被调用时会以某种方式触发新请求。(听更改事件Filter也不是一个选项,因为用户应该在多个步骤中更改过滤器选项并决定通过单击按钮手动应用过滤器)

4

1 回答 1

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");
于 2013-09-24T15:51:04.617 回答