我有类似的服务:
angular.module('app').factory('ExampleService', function(){
this.f1 = function(world){
return 'Hello '+world;
}
return this;
})
我想从JavaScript控制台对其进行测试,然后调用f1()
该服务的功能。
我怎样才能做到这一点?
我有类似的服务:
angular.module('app').factory('ExampleService', function(){
this.f1 = function(world){
return 'Hello '+world;
}
return this;
})
我想从JavaScript控制台对其进行测试,然后调用f1()
该服务的功能。
我怎样才能做到这一点?
Answers:
angular.element(document.body).injector().get('serviceName')
AngularJS使用依赖注入(DI)将服务/工厂注入到您的组件,指令和其他服务中。所以,你需要做的就是一个服务是什么,以获得注入第一AngularJS的(喷油器是负责接线了所有的依赖关系和它们提供给组件)。
要获取应用程序的注入器,您需要从angular正在处理的元素中获取它。例如,如果您的应用程序已在您调用的body元素上注册injector = angular.element(document.body).injector()
从检索到的内容中,injector
您可以享受所需的任何服务injector.get('ServiceName')
关于此问题的更多信息,请参见:无法从angular检索注入器在
这里甚至更多:从旧版代码调用AngularJS
获取$scope
特定元素的另一个有用技巧。使用开发人员工具的DOM检查工具选择元素,然后运行以下行($0
始终为选定元素):
angular.element($0).scope()
document
也可以使用:angular.element(document).injector().get('serviceName')
首先,是服务的修改版本。
var app = angular.module('app',[]);
app.factory('ExampleService',function(){
return {
f1 : function(world){
return 'Hello' + world;
}
};
});
这将返回一个对象,此处无新内容。
现在从控制台获取此内容的方法是
var $inj = angular.injector(['app']);
var serv = $inj.get('ExampleService');
serv.f1("World");
您之前在此处所做的一件事是假设app.factory返回了函数本身或函数的新版本。事实并非如此。为了获得构造函数,您要么必须要做
app.factory('ExampleService',function(){
return function(){
this.f1 = function(world){
return 'Hello' + world;
}
};
});
这将返回ExampleService构造函数,您接下来将必须对其执行“新操作”。
或者,
app.service('ExampleService',function(){
this.f1 = function(world){
return 'Hello' + world;
};
});
这将在注入时返回新的ExampleService()。
var $inj = angular.injector(['app']);
,控制台会Error: Unknown provider: $filterProvider from app
在一个应用程序和Error: Unknown provider: $controllerProvider from app
另一个应用程序中抛出一个……
angular.module('app',[]);
,然后在不同文件中有服务,控制器等,它们的定义都一样angular.module('app').factory('FeatureRegistry',function(){//code here});
,例如
@JustGoscha的答案很明确,但是我要访问时要输入很多,因此我将其添加到了app.js的底部。然后,我需要输入的就是x = getSrv('$http')
获取http服务。
// @if DEBUG
function getSrv(name, element) {
element = element || '*[ng-app]';
return angular.element(element).injector().get(name);
}
// @endif
它将其添加到全局范围,但仅在调试模式下。我将其放在内,@if DEBUG
以免最终在生产代码中出现。 我使用这种方法从生产版本中删除调试代码。
Angularjs依赖注入框架负责将应用程序模块的依赖关系注入到控制器中。通过其注射器可以做到这一点。
您需要首先识别ng-app并获取关联的注射器。以下查询可在DOM中找到您的ng-app并检索注射器。
angular.element('*[ng-app]').injector()
但是,在chrome中,您可以如下所示指向目标ng-app。并使用$0
hack和问题angular.element($0).injector()
拥有注入器后,请获取以下依赖项注入服务
injector = angular.element($0).injector();
injector.get('$mdToast');
angular.element('*[ng-app]').injector()
应该适用于所有情况。