#javascript #backbone.js #filter
#javascript #backbone.js #Фильтр
Вопрос:
У меня небольшая проблема с тем, как наилучшим образом фильтровать магистральную коллекцию по ее атрибутам моделей. Моя настройка такая:
У меня есть коллекция с несколькими моделями в ней. Каждая модель имеет атрибут, который содержит массив чисел («тип»). Вот так:
- Collection
- model
- id: 1
- name
- phone
- type [3]
- model
- id: 2
- name
- phone
- type [2]
- model
- id: 3
- name
- phone
- type [1,2]
Что я хочу здесь сделать, так это иметь возможность фильтровать эти коллекции по атрибуту «тип» модели.
У меня есть этот атрибут «type», потому что это для списка контактов, и каждый контакт может быть нескольких типов. Например. коллекция должна быть способна фильтроваться по неограниченным типам. Вы должны иметь возможность фильтровать, скажем, по типу «1» и типу «2», которые затем будут показывать модель 2 и модель 3. Причина в том, что модель 1 не имеет «типа» 1.
Любые хорошие примеры кода или другая помощь по этому вопросу были бы замечательными. Спасибо!
Ответ №1:
Вы можете использовать следующий код
var filColl=myColl.filter(function(o){return _.indexOf(o.get('type'), 1) >-1 })
Вот ссылка jsFiddle рабочего кода с некоторыми примерами данных.
Комментарии:
1. Привет! Спасибо, это отлично работает для типа 1. Но мне было интересно, как я мог бы сделать это немного более динамичным? Например, иногда тип может быть как 1, так и 2. Эта фильтрация выполняется по событию щелчка. Итак, я думал о том, чтобы просто поместить тип в качестве объекта данных в массив по щелчку мыши. А затем фильтровать ее в зависимости от того, какие типы в данный момент содержит этот массив. (сопоставление его с коллекцией)
Ответ №2:
Привет, вот код, который может фильтровать по нескольким типам, хранящимся в массиве
var typesTofilter=[5,1,2];//array of type tobe search.
var f2=friends.filter(function(o){ var accept=false;
$(typesTofilter).each(function(i,val){
if(_.indexOf(o.get('type'), val) >-1){
accept= true;
}
})
return accept;
});
И вот jsFiddle .
Комментарии:
1. Спасибо, чувак! Worsk отлично. Если я теперь хочу сбросить мою текущую отображаемую коллекцию с соответствующим результатом?
2. Неважно. разберитесь с этим. Это было действительно просто, просто использовал collection.reset() и передал новый результат. Также была коллекция для прослушивания события изменения.