Angular JS - 解析自定义函数

时间:2015-10-19 14:16:24

标签: javascript angularjs

我有一个以服务作为参数的功能。

function CustomFunc(MyAngularService) {
}

此功能不在角度的上下文中。这未注册为服务。有没有办法调用此函数并获取注入的依赖项并获得结果?也许使用某种角度DI服务?

我能想到的一种方法是使用this之类的方法获取函数的参数名称,然后使用$ injector服务来解析依赖关系并使用这些依赖关系调用函数。有没有更好的方法来实现这一目标?

3 个答案:

答案 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();
});

Click here for live demo.

旧答案

您可以使用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的模块的组件。

此处 is a demo jsfiddle