我是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 !';
});
为什么依赖注入只适用于返回的函数?
我知道我真的很困惑,如果有人能帮助我,我会非常感激,谢谢大家,祝你们度过愉快的一天。
答案 0 :(得分:20)
答案与你的问题相反。 Angular将仅注入工厂函数,但不注入结果函数:
.filter('newBookFilter', function($log, ...){ // <- factory function
return function(input, ...){ // <- resulting function
};
})
工厂功能具有任意注入参数。结果函数有固定的参数。
第二个原因是你可以在工厂功能中做一些初始化。例如,当您定义new directive时,这很有用。工厂还返回闭包,它可以从工厂函数中捕获变量和参数。见下面的例子。它使用依赖注入来获取日志记录对象。 Here就是一个完整的例子。
.filter('joinBy', function ($log) { // <- injected here
return function (input, delimiter) { // <- used here
var res = (input || []).join(delimiter || ',');
$log.info(res);
return res;
};
});
答案 1 :(得分:11)
我认为Angular工厂,服务,过滤器,指令包装器是使用Angular风格创建JavaScript对象和函数的烤箱。所以,从Vasiliy的回答中借用同样的风格:
// Don't use this code in a real app. It's 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 :(得分:0)
这就是我做到的。
UIAlertController