我有一个以服务作为参数的功能。
function CustomFunc(MyAngularService) {
}
此功能不在角度的上下文中。这未注册为服务。有没有办法调用此函数并获取注入的依赖项并获得结果?也许使用某种角度DI服务?
我能想到的一种方法是使用this之类的方法获取函数的参数名称,然后使用$ injector服务来解析依赖关系并使用这些依赖关系调用函数。有没有更好的方法来实现这一目标?
答案 0 :(得分:6)
您可以使用$injector
服务从控制器,服务或指令中调用此自定义函数。
这是一个例子。
function CustomFunc(MyAngularService) {
}
angular.controller('Foo',function($injector) {
$injector.invoke(CustomFunc); // <-- will handle dependencies for you
});
答案 1 :(得分:2)
只是考虑应用@ ThinkingMedia的答案。如果您希望通过Angular的DI使用它们,您可以将所有功能一次性转换为Angular服务。
function fn1(foo) {
console.log('fn1', foo);
}
function fn2(bar) {
console.log('fn2', bar);
}
function fn3(foo) {
console.log('fn3', foo);
}
// put the functions into an array and interate over them
[fn1, fn2, fn3].forEach(function(fn) {
// use the function's name (es6) as service name
app.factory(fn.name, function($injector) {
return $injector.invoke.bind($injector, fn);
});
});
app.controller('MyCtrl', function(fn1, fn2, fn3) {
// called with services injected
fn1();
fn2();
fn3();
});
您可以使用Angular服务包装它。
function CustomFunc(MyAngularService) {
//etc
}
app.factory('foo', function(MyAngularService) {
return CustomFunc.bind(MyAngularService); // or however suits you
});
如果改变用法,@ MichaelP.Bazos提供的解决方案可能最适合您。我相信这就是你想要做的事情:
CustomFunc(angular.injector(['myApp']).get('SomeService'));
CustomFunc(angular.injector(['myApp']).get('AnotherService'));
但你也可以减少这种冗长,我认为无论如何最好使用$injector
服务:
app.controller('MyCtrl', function($injector) {
CustomFunc($injector.get('SomeService'));
});
答案 2 :(得分:2)
从外部角度背景,你可以试试这个:
angular.injector(['myApp']).get('MyAngularService')
假设MyAngularService
是名为myApp
的模块的组件。