AngularJS:将服务和工厂注入非AngularJS函数

Max*_*aco 1 javascript angularjs

我希望能够在运行时执行自定义外部脚本,并允许他们访问我的AngularJS自定义服务和工厂.

加载的脚本不应该是控制器,因为我没有兴趣将它们链接到任何视图.

看起来应该是这样的:

1)在运行时加载外部脚本

2)注入该函数自定义AngularJS服务和工厂,然后执行它.

是否有可能注入这种方式?

New*_*Dev 5

在你问的时候回答这个问题 - 是的,你可以做这样的事情.

您可以使用它injector来获取服务实例:

angular.injector(["Your.Service.Module"]).get("FooSvc");
Run Code Online (Sandbox Code Playgroud)

请记住,如果您的服务具有其他依赖项,那么您需要指定所有这些依赖项.例如,如果您的服务需要$timeout:

angular.module("fooModule", []).factory("FooSvc", function($timeout){
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后你需要像这样注入它:

var fooSvcInstance = angular.injector(["fooModule", "ng"]).get("FooSvc");
Run Code Online (Sandbox Code Playgroud)

另请注意,服务实例将与注入应用程序的实例不同.

Plunker

您应该重新评估为什么需要这样做.

编辑

要获得与应用程序获得的服务相同的实例,您需要获得相同的注入器实例.要做到这一点,您需要injector在Angular的应用程序中对象来自DOM元素.例如,让我们说<body>你的应用程序:

// make sure that body has loaded (for example, in window.onload)
var injectorInstance = angular.element(document.body).injector();
var fooSvcInstance = injectorInstance.get("FooSvc");
Run Code Online (Sandbox Code Playgroud)

更新了Plunker