如何从控制台测试AngularJS服务?

Jus*_*cha 392 angularjs angularjs-service

我有这样的服务:

angular.module('app').factory('ExampleService', function(){
  this.f1 = function(world){
    return 'Hello '+world;
  }
  return this;
})
Run Code Online (Sandbox Code Playgroud)

我想从JavaScript控制台测试它并调用f1()服务的功能.

我怎样才能做到这一点?

Jus*_*cha 700

TLDR:在一行中您正在寻找的命令:

angular.element(document.body).injector().get('serviceName')
Run Code Online (Sandbox Code Playgroud)

深潜

AngularJS使用依赖注入(DI)将服务/工厂注入到组件,指令和其他服务中.所以,你需要做的就是服务什么是让注射器 AngularJS的第一(喷油器是负责接线了所有的依赖关系和它们提供给组件).

要获得应用程序的注入器,您需要从角度处理的元素中获取它.例如,如果您的应用程序已在您调用的body元素上注册injector = angular.element(document.body).injector()

从检索到的,injector您可以获得您喜欢的任何服务injector.get('ServiceName')

在这个答案中有关于此的更多信息:无法从角度检索注入器在
这里更多:从遗留代码调用AngularJS


获得$scope特定元素的另一个有用技巧.使用开发人员工具的DOM检查工具选择元素,然后运行以下行($0始终是所选元素):
angular.element($0).scope()

  • 我也必须这样做才能使它发挥作用.BTW,`angular.element('*[ng-app]').injector()`应该适用于所有情况. (70认同)
  • `document`也有效:`angular.element(document).injector().get('serviceName')` (9认同)
  • 仅供参考我想使用$ location服务,但最终我需要将其包装在scope.apply中.我知道这是有据可查的,但它已经让我感到不安.在一行angular.element(document).scope().$ apply(angular.element(document).injector().get('$ location').path('/ my/angular/url')) (5认同)
  • 如果你得到错误'选择器未实现'执行angular.element('html'),那么你可以使用Chrome $ 0功能.选择html元素,转到控制台并运行angular.element($ 0).injector() (4认同)

gan*_*raj 24

首先,您的服务的修改版本.

一个 )

var app = angular.module('app',[]);

app.factory('ExampleService',function(){
    return {
        f1 : function(world){
            return 'Hello' + world;
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

这会返回一个对象,这里没有任何新内容.

现在从控制台获取此功能的方法是

b)

var $inj = angular.injector(['app']);
var serv = $inj.get('ExampleService');
serv.f1("World");
Run Code Online (Sandbox Code Playgroud)

C )

你之前在那里做的事情之一是假设app.factory返回函数本身或它的新版本.事实并非如此.为了得到一个构造函数,你要么必须这样做

app.factory('ExampleService',function(){
        return function(){
            this.f1 = function(world){
                return 'Hello' + world;
            }
        };
    });
Run Code Online (Sandbox Code Playgroud)

这将返回一个ExampleService构造函数,接下来您必须执行"new"操作.

或者,

app.service('ExampleService',function(){
            this.f1 = function(world){
                return 'Hello' + world;
            };
    });
Run Code Online (Sandbox Code Playgroud)

这会在注入时返回新的ExampleService().

  • 当我做`var $ inj = angular.injector(['app']);`然后控制台在一个应用程序中抛出一个`错误:未知提供者:来自app的$ filterProvider'和'错误:未知提供者:来自app的$ controllerProvider `在另一个应用中...... (3认同)

boa*_*der 12

@ 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
Run Code Online (Sandbox Code Playgroud)

它将其添加到全局范围,但仅在调试模式下.我把它放在里面,@if DEBUG所以我不会在生产代码中结束它. 我使用此方法从prouduction构建中删除调试代码.


Fai*_*eef 5

Angularjs 依赖注入框架负责将应用程序模块的依赖项注入到控制器中。这可以通过其注入器实现。

您需要首先识别 ng-app 并获取关联的注入器。下面的查询可以在 DOM 中查找您的 ng-app 并检索注入器。

angular.element('*[ng-app]').injector()
Run Code Online (Sandbox Code Playgroud)

但是,在 Chrome 中,您可以指向目标 ng-app,如下所示。并使用$0hack 和问题angular.element($0).injector()

拥有注入器后,获取任何依赖项注入服务,如下所示

injector = angular.element($0).injector();
injector.get('$mdToast');
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述