Внедрить фильтр с помощью вспомогательной функции AngularJS

У меня есть два фильтра, которые используют часть кода, которая идентична и может быть извлечена как функция (помощник). Я мог бы поместить его в контроллер, но главная проблема в том, что я не уверен, как передать его и сделать видимым для фильтра, чтобы использовать его впоследствии.

Есть ли решение для этого? Спасибо.


person Eugene    schedule 14.03.2014    source источник
comment
Этот ответ может удовлетворить ваши потребности: stackoverflow.com/a/21451815/1225328.   -  person sp00m    schedule 14.03.2014
comment
Работает ли тот же принцип с передачей аргумента в фильтр?   -  person Eugene    schedule 14.03.2014
comment
Вам просто нужно ввести фабрику в свой фильтр: .filter('YourFilter', function(YourFactory) {...})   -  person sp00m    schedule 14.03.2014


Ответы (1)


Просто объявите фильтр и службу в вашем угловом модуле следующим образом:

angular.module('myModule')
    .service('myFilterService', function () {   
            this.mySharedCode = function () {
                // Put your shared code here
            };
        })
    .filter('myFilter1', function (myFilterService) {
        return function (input, arg) {
            if (typeof input !== 'undefined') {
                // Do your filtering using myFilterService
                myFilterService.mySharedCode(...)
                return myFilteredInput
            } else {
                return myReturnValueIfInputUndefined;
            }
        }
    })
    .filter('myFilter2', function (myFilterService) {
        // Do your filtering using myFilterService like you did with myFilter1
    })

Предполагая, что у вас есть item в области видимости, вы можете использовать свой фильтр

В ваших контроллерах:

.controller('myController', function ($scope, $filter) {
    var filteredItem = $filter('myFilter')($scope.item, filterArg);
}

В ваших шаблонах:

{{ item | myFilter : filterArg }}
person Timothée Jeannin    schedule 14.03.2014
comment
Я нигде не говорил, что этот фильтр для ng-repeat и что он будет применяться к каждому элементу массива. Те, что мне не нужны в контроллере. - person Eugene; 14.03.2014
comment
Хорошо, нет проблем, это просто пример того, как разделить код между двумя фильтрами с помощью службы. Конечно, ваш фильтр может делать все, что вы хотите... Обновлю свой ответ, чтобы отразить это. - person Timothée Jeannin; 14.03.2014
comment
То, что мне действительно нужно, уже описано в первом комментарии. то есть gist.github.com/jeserkin/9545559 - person Eugene; 14.03.2014
comment
Он использует factory вместо service. Вы сказали, что идентичный код может быть извлечен как функция, поэтому можно работать с одним уникальным экземпляром службы для обоих ваших фильтров. С другой стороны, если вам нужны отдельные экземпляры для каждого из ваших фильтров, используйте заводское решение... - person Timothée Jeannin; 14.03.2014