2013-10-14 6 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', чтобы развернуть' search' часть JSON? –

ответ

2

есть ли конкретная причина вы используете модель для этого случая, а не Backbone коллекции? Вы можете легко иметь модель для одного результата поиска:

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

спасибо за это. Причина использования модели вместо коллекции заключается в том, что я не делал код для начала, и это будет слишком много для рефакторинга из-за жестких сроков и т. Д. ... Я попробую ваше решение, надеюсь, это должно быть хорошо. – Shaoz

Смежные вопросы