Внедрить dateFilter в службу в AngularJs

Я хотел бы знать, есть ли способ внедрить фильтры в службу в AngularJs.

Я пытался

app.factory('educationService', [function($rootScope, $filter) {

    // ..... Some code

    // What I want
    console.log(dateFilter(new Date(), 'yyyy-MM-01'));

    // ..... Some code

}]);

Поэтому я хотел бы знать, можно ли внедрить фильтр в службу или, может быть, он доступен другим способом.

И если у вас есть ссылка на документацию по этому поводу, было бы очень хорошо :) Я искал в документации Angular, и я не нашел в этом ничего действительно полезного.

Спасибо :)


person Julien Rodrigues    schedule 14.03.2013    source источник


Ответы (2)


Сначала вам нужно ввести такой фильтр:

app.factory('myService', ['$rootScope', '$filter', function($rootScope, $filter) 

(Массив нужен только тогда, когда вы используете минификацию в процессе сборки)

Чтобы программно вызвать конкретный фильтр:

$filter('date')(new Date(), 'yyyy-MM-01');

$filter(name) возвращает конкретную функцию фильтра, которую вы можете вызвать со своими аргументами:

var dateFilter = $filter('date');
var filteredDate = dateFilter(new Date(), 'yyyy-MM-01')
person Stewie    schedule 14.03.2013
comment
Здравствуйте, спасибо за ответ. Я пробовал это, когда искал, но у меня возникла ошибка $ filter не является функцией, поэтому я подумал, что это неправильно. Я собираюсь проверить, что происходит. Может отсутствующая зависимость или что-то в этом роде. Хорош ли способ передать $ filter в моем примере? - person Julien Rodrigues; 14.03.2013
comment
Недостаточно хорошо, если вы минимизируете свои скрипты. С app.factory('educationService', ['$rootScope', '$filter', function($rootScope, $filter) {... ты всегда будешь в безопасности. Похоже, вы использовали встроенную аннотацию, но забыли безопасно ввести фактические зависимости внутри массива. - person Stewie; 14.03.2013
comment
Да, я минимизирую свои скрипты. Спасибо за информацию, теперь она отлично работает :) - person Julien Rodrigues; 14.03.2013
comment
Спасибо! Документация AngularJS кажется неверной. Они показывают следующее: $ filter ('date', object) - person Jim Raden; 19.02.2014

Функция фильтра зарегистрирована с $injector под именем фильтра с суффиксом Filter. - $ filterProvider docs

Это верно как для встроенных фильтров Angular, так и для ваших собственных фильтров.

Итак, вы можете ввести dateFilter в свою службу следующим образом (если не уменьшать):

app.factory('educationService', [function($rootScope, dateFilter) {

Если вы используете только один фильтр, этот метод позволяет более точно определить ваши фактические зависимости. Если вам нужно использовать несколько фильтров, вы можете ввести $filter, например, показывает @Stewie.

person Mark Rajcok    schedule 14.03.2013
comment
+1 Этот ответ более правильный, чем выбранный ответ от @Stewie, потому что в нем упоминается возможность внедрения определенного фильтра вместо всей службы $filter - person tsemer; 26.05.2015
comment
+1 Я продолжал делать filterDate вместо dateFilter. Это было то, что я искал, я знал, что должен быть способ лучше, чем внедрение всего $filter сервиса. - person Zane; 09.08.2016