如何将Backbone.Collection定义为属性但不是Backbone.Model的属性?

时间:2013-09-24 07:09:09

标签: backbone.js

假设我有一个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的更改事件不是一个选项,因为用户应该在多个步骤中更改过滤器选项,并决定通过按钮单击手动应用过滤器)

1 个答案:

答案 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");