2013-10-14 63 views
0

我想知道是否有可能过滤模型,比如如何过滤集合?Backbone.js中的过滤模型(非收集)

我做了一个运动网站的搜索功能,我希望能够通过过滤器类型的搜索结果,即足球,网球,篮球,游泳,田径等..

这里的我的代码(检查filterSearch()法):

define([ 
    'jquery', 
    'backbone', 
    'underscore', 
    'models/model'], 

    function($, Backbone, _, Model){ 

    var Search = Model.extend({ 

     urlRoot: '/search', 

     defaults: { 
      query: '' 
     }, 

     initialize: function(attrs, options) { 

      if (typeof options === 'object') { 
       this.router = options.router; 
      } 
     }, 

     filterSearch: function(type) { 
      this.filter(function(data) { 
       return data.get(type); 
      }); 
     } 

    }); 

    return Search; 
}); 

JSON:

[ 
    { 
     "search": [ 
      { 
       "result": { 
        "query": "Vettel is world champion" 
       }, 
       "type": "Formula 1", 
       "id": 1 
      }, 

      { 
       "result": { 
        "query": "Romario of Brazil world cup 1994" 
       }, 
       "type": "football", 
       "id": 2 
      }, 

      { 
       "result": { 
        "query": "federe won again" 
       }, 
       "type": "tennis", 
       "id": 3 
      } 


     ] 
    } 
] 
+1

你能提供一个JSON的例子来说明搜索api的结果是什么样的吗?目前尚不清楚你将要过滤的是什么。 – ne8il

+0

@ ne8il,感谢您的回复。由于我工作的数据保护法律,我无法显示我正在使用的json。但是我已经包含了一个类似和更简单的版本,尽管... – Shaoz

+1

JSON看起来更像是一个集合而不是模型。为什么你没有一个带'parse'方法的集合来解开JSON的'search'部分? –

回答

2

是否有您使用的是型号为这种情况下,而不是骨干收集特定的原因是什么?你可以很容易地对单个搜索结果的型号:

var searchResult = Backbone.Model.extend({}); 

和集合,表示搜索

var Search = Backbone.Collection.extend({ 
    model : searchResult, 
    urlRoot: '/search', 

    filterSearch: function(type) { 
     return this.where({'type' : type}); 
    }, 
    parse: function(response) { 
     return response.search; 
    } 

}); 

否则只是搜索模型所提供的阵列上:

..

filterSearch: function(type) { 
    return _.where(this.get('search'), {'type' : type}); 
} 
+0

感谢您的支持。使用Model而不是Collection的原因是因为我没有开始执行代码,并且由于时间紧迫等原因会重构太多内容......我会尝试您的解决方案,希望它应该是精细。 – Shaoz