Papazian
@Papazian
Изучаю webdev

Как в AngularJS создать кастомный фильтр с зависимостями?

Добрый день.

Несколько часов бьюсь над проблемой, причина которой, скорее всего, мое слабое знание AngularJS. Как говорится, все пальцы в кровь сгуглил, а решения не нашёл.

Надо создать кастомный фильтр, который отбраковывал бы все, что входит в заданный массив. Массив доступен в $scope, фильтр в отдельном файле addIngrFilter.js

Вот код файла с фильтром:
angular
	.module('quApp')
	.filter('addIngrFilter', ['$scope', function($scope) {
		return function (items){
			var filtered = [];
			items.forEach(function(item){
				if($scope.dishIngredientsIndexes.indexOf(item.id)<0){
					filtered.push(item);
				}
			});
			return filtered;
		};
	}]);

Однако, Angular ругается, говорит Error: [$injector:unpr] и шлёт по адресу: https://docs.angularjs.org/error/$injector/unpr?p0...

Что я делаю не так?
  • Вопрос задан
  • 547 просмотров
Решения вопроса 1
Papazian
@Papazian Автор вопроса
Изучаю webdev
Решил! Итоговый код фильтра выглядит так:
angular
	.module('quApp')
	.filter('ingrListFilter', function() {
		return function (items, filter){
			return _.reject(items, function(item){
				return _.contains(filter, item.id);
			});
		};
	});

А вызов фильтра так:
<span ng-repeat="ingredient in ingredients | ingrListFilter:dishIngredientsIndexes">
    <span class="badge">{{ingredient.name}}</span>
</span>


dishIngredientIndexes - это массив, которым надо отфильтровать исходные данные.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
premas
@premas
Full-stack web-developer
$scope доступен только внутри контроллеров и link-функций директив. И фильтр должен быть не жестко завязан на какую-то переменную. Вы должны ее передавать в фильтр. Если я правильно понял, то нужно так:

.filter('addIngrFilter', [function() {
    return function (items, item){
      var filtered = [];
      items.forEach(function(items){
        if(items.indexOf(item.id)<0){
          filtered.push(item);
        }
      });
      return filtered;
    };
  }]);


<div>{{dishIngredientsIndexes | item_for_exclude}}</div>


А вообще, познакомьтесь с Underscore.js
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы