Пользовательский фильтр Angularjs и инъекция зависимостей
Я новичок в AngularJS, и я вижу этот синтаксис много:
function someFunc(){
return function(input){
return 'hello' + input;
}
}
Вышеприведенная функция является общим синтаксисом. Я часто вижу много, но проблема специфична в этом примере для настраиваемого фильтра:
angular.module('bookFilters', [])
.filter('newBookFilter', function(){
return function(input){
return 'The Book: ' + input.name + 'is new !';
};
});
Я понимаю, что перенос функции с помощью другой функции дает мне возможность использовать инъекцию зависимостей. Вот мои вопросы:
Получает ли фильтр функцию, возвращаемую из функции обертки? Тогда можно ли использовать инъекцию зависимостей для ввода значения в функцию? Теоретически это:
Этот код:
{{bookObj | newBookFilter}}
Станет:
{{ bookObj | function(input){return 'The Book: ' + input.name + 'is new !'; } }}
И, наконец, {{}}
вернет окончательное значение из функции.
Почему я не могу просто ввести input
в первую функцию, например:
angular.module('bookFilters', [])
.filter('newBookFilter', function(input){
return 'The Book: ' + input.name + 'is new !';
});
Почему инъекция зависимостей будет работать только с возвращенной функцией?
Я знаю, что я действительно запутался здесь. Если кто-нибудь может мне помочь, я буду очень благодарен, спасибо всем и у вас хороший день.
Ответы
Ответ 1
Я думаю о Angular factory, об услугах, фильтрах, директивных упаковщиках, таких как духовки, которые создают объекты и функции JavaScript с ароматами Angular. Итак, чтобы взять тот же стиль у Василия, ответьте:
// Don't use this code in a real app. It just to illustrate a point.
angular.module('App', [])
// The following oven makes an Angular flavored JavaScript function that
// formats a currency
.service('currencyBadFilterFn',
// We inject a built-in Angular filter, currencyFilter, into our oven
function(currencyFilter) {
// oven produces a function that can be used in other places in Angular code
return function(number) {
// produced function returns a currency-formatted number when used
return currencyFilter(number)
}
}
)
.controller('MainCtrl',
function($scope, currencyBadFilterFn) {
$scope.amount = currencyBadFilterFn(10) // $10.00
}
)
Как вы можете видеть, тот же шаблон используется при создании служб. Здесь мы создаем службу, которая возвращает функцию, которую мы можем использовать в других местах нашего кода.
Первая функция, функция духовки, вместе с оберткой .service
или .factory
или .filter
, сообщает Angular, как построить вашу функцию. Возвращаемое значение этой первой функции - это то, что вы будете использовать в своем коде.
Ответ 2
Ответ противоположный вашему вопросу. Angular вводит только в factory, но не в результирующую функцию:
.filter('newBookFilter', function($log, ...){ // <- factory function
return function(input, ...){ // <- resulting function
};
})
Функция Factory имеет произвольные введенные параметры. Результирующая функция имеет фиксированные параметры.
Вторая причина заключается в том, что вы можете выполнить некоторую инициализацию в функции factory. Это полезно, например, при определении новой директивы. Кроме того, factory возвращает замыкание, которое может захватывать переменные и аргументы из функции factory. См. Пример ниже. Он использует инъекцию зависимостей для получения объекта регистрации. Здесь приведен полный пример.
.filter('joinBy', function ($log) { // <- injected here
return function (input, delimiter) { // <- used here
var res = (input || []).join(delimiter || ',');
$log.info(res);
return res;
};
});
Ответ 3
Вот как я это сделал.
myApp.filter("myCustomDateFormatter", ['MyFactoryWithCustomFunctions', function (InjectedCustomFunction) {
return function (input) {
return InjectedCustomFunction.GetDateFromDotNetJson(input);
}
}]);