Как решить проблему с фильтрацией коллекции backbone?

Решил, что пора взрослеть и переучиваться лапшекодить на jquery - выбрал для начала backbone, чтобы более-менее разобраться с клиентским MVC.

Вьюшка перерисовывается, модельки сохраняются, да коллекции не фильтруются:
имеется коллекция с фильтром (все просто):
var AdList = Backbone.Collection.extend({
	url: "/ads",
	model: app.Ad,
	byParam: function (param) {
		param = param || {};
		var filtered = this.filter(function (ad) {
			var byDevice = param.device ? _.contains(_.pluck(ad.get('devices'), 'title'), param.device) : 1,
				byPlatform = param.platform ? _.contains(_.pluck(ad.get('platforms'), 'title'), param.platform) : 1;
				var byOldVersions = 1, byLastVersion = 1;
				if(param.for_old_versions){
					byOldVersions = ad.get('for_old_versions');
				}
				if(param.for_last_version){
					byLastVersion = ad.get('for_last_version');
				}
			return byDevice && byPlatform && byOldVersions && byLastVersion;
		});
		// console.log('filtered', new AdList(filtered));
		return (filtered);
	},
});
app.Ads = new AdList([{"id":91,"title":"asldknnsadl"},  ....]); // тут json с сервера


Далее в вью мы меняем всякие значения инпутов и у нас срабатывает событие filter, которое обрабатывается вот таким способом:
this.on('filter', function(param){
		this.collection.reset(this.collection.filtering(param));
	}, this);

Заменяю коллекцию новыми значениями - все ок.
На render установлен обработчик, перерисовывающий список.

Суть проблемы вот в чем:
заменяя коллекцию через reset, почему-то дропается app.Ads -- это нормальное поведение?

Если "да", то как правильно фильтровать коллекции?
Есть мысль дублировать коллекцию внутри и рендерить новую фильтрованную, но мне кажется, что это костыль какой-то.

Спасибо!
  • Вопрос задан
  • 3324 просмотра
Решения вопроса 1
Grigorieff
@Grigorieff
reset - скидывает всю коллекцию и добавляет в нее новые модели, указанные вами, т. е. судя по вашему коду вы отфильтровали модели и добавили их в коллекцию, модели не удовлетворяющие фильтру дропнутся.

Т. е. если вы хотите перерендеринг вешать на reset, то тут вам нужна новая коллекция, либо можно во вьюхе написать метод который будет отрисовывать вашу коллекцию для указанных фильтров:

this.on('filter', function(attr,val){
    $('collectionContainer').empty();
     _.each(this.collection.search(attr,val),this.addOne,this);
}


В коллекции:

search: function(attribute,value) {
            var val = _.trim(value);
            
             if( val === '' ) {
                return this.models;
            }

            return this.filter(function(x){
                var regForCompany = new RegExp(val, "i");
                return x.get(attribute).match(regForCompany);
            });
        },


Ну метод search ток переписать под ваши условия, а то у меня тут для одного свойства коллекции условия.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@personaljs
Для того чтобы фильтровать модели в коллекции есть стандартные функции в backbone this.collection.where({}) и this.collection.findWhere({}). принципе их должно хватить вам. Подробнее здесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы