【问题标题】:How to define a Backbone.Collection to be a property but not an attribute of a Backbone.Model?如何将 Backbone.Collection 定义为属性而不是 Backbone.Model 的属性?
【发布时间】:2013-09-29 06:52:15
【问题描述】:

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

很自然地,我最终创建了一个扩展 Backbone.ModelFilter 和一个扩展 Backbone.CollectionSearchResultList >。过滤器有一些属性,如 searchTermdataFromdateTo...过滤器还有一个称为applyFilter 的方法。 Filter.applyFilter 应该调用searchResultList.fetch,从而更新/过滤搜索结果。

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

我不想在Filter.initialize 中创建SearchResultList,因为SearchResultList 不一定由Filter“拥有”。

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

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

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    我有一个用于执行搜索的集合。我的大部分收藏都扩展了这个搜索收藏。

    它有一个对象,其中包含用于搜索的参数。集合的用户可以调用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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多