从简单的 js 代码调用 angularjs 服务
Posted
技术标签:
【中文标题】从简单的 js 代码调用 angularjs 服务【英文标题】:Call angularjs service from simple js code 【发布时间】:2013-06-23 13:48:26 【问题描述】:我有以下 angularjs 服务:
angular.module('app.main').factory('MyService', ["$http", function ($http)
return new function ()
this.GetName = function ()
return "MyName";
;
;
]);
如何从旧版 js 代码中的 MyService
调用 GetName
函数?
【问题讨论】:
【参考方案1】:使用angular.injector。使用您的代码,您可以执行以下操作:
angular.module('main.app', []).factory('MyService', ['$http', function ($http)
return new function ()
this.GetName = function ()
return "MyName";
;
;
]);
angular.injector(['ng', 'main.app']).get("MyService").GetName();
这里是 jsfiddle:http://jsfiddle.net/wGeNG/
注意 - 在加载自定义模块之前,您需要添加“ng”作为您的第一个模块,因为您的示例代码依赖于 ng 模块中的 $http 提供程序。
EDIT - 在 OP 的回答中使用get()
但请注意,此代码正在获取服务,而不依赖于绑定到应用模块“main.app”的元素”。
【讨论】:
哦,是的,我真的需要这个。谢谢,为你点赞:D 一句警告:对我来说,这个解决方案没有 100% 有效,因为我的服务试图获取在 ng-template 元素中定义的模板但未能这样做(没有找到)。然而,@DorCohen 提出的解决方案在这种情况下也非常有效。 "angular.injector
创建一个新的注入器函数,它不返回与引导应用程序关联的注入器函数。"如here 所述。即,它将为您的服务注入新的$rootScope
。
如果myservice调用其他服务,如何获取Myservice?
在我的例子中,工厂返回了一个函数(不是 new 函数),所以它看起来更像这样:angular.injector(['ng', 'main.app']).get("MyService")()
【参考方案2】:
使用以下行有助于从 angularjs 服务执行我的方法:
angular.element('*[ng-app]').injector().get("MyService").GetName ();
【讨论】:
这个解决方案对我不起作用,但下面的解决方案对我有用。【参考方案3】:对我来说,它适用于:
angular.element(document.body).injector().get("MyService")
尝试此操作时出现“未知提供者”错误:
angular.injector(['ng', 'main.app']).get("MyService")
因为我正在使用 jqLite,所以我不能这样做
angular.element('*[ng-app]')
因为 jqLite 不支持选择器,但我得到了 [Dor Cohen] 的想法。我的指令 ng-app 在我的 body 标签上,然后我可以使用:
angular.element(document.body).injector().get("MyService")
或
angular.element(document).find('body').injector().get("MyService")
【讨论】:
接受的答案对我不起作用,但这个答案对我有用。 +1【参考方案4】:这是我使用的一个实用方法:
function getService(name, element)
element = element || '*[ng-app]';
return angular.element(element).injector().get(name);
getSrv("name-of_service", document.body)
【讨论】:
以上是关于从简单的 js 代码调用 angularjs 服务的主要内容,如果未能解决你的问题,请参考以下文章
无法从简单的 Ajax 函数调用 Spring Boot RestController 中的 GET 方法