提问



我有这样的服务:


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


我想从JavaScript控制台测试并调用服务的函数f1()


我怎样才能做到这一点?

最佳参考


所以我发现如果已经存在注射器,你不能简单地调用angular.injector(['app'])。因为此函数尝试创建新的注入器。


相反,你必须打电话injector = angular.element(document.body).injector()


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


所以在一行中,命令看起来像这样:


angular.element(document.body).injector().get('serviceName')


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


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

angular.element($0).scope()

其它参考1


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


a)



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

app.factory('ExampleService',function(){
    return {
        f1 : function(world){
            return 'Hello' + world;
        }
    };
});


这会返回一个对象,这里没什么新东西。


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


b)



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


c)



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


app.factory('ExampleService',function(){
        return function(){
            this.f1 = function(world){
                return 'Hello' + world;
            }
        };
    });


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


或者,


app.service('ExampleService',function(){
            this.f1 = function(world){
                return 'Hello' + world;
            };
    });


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

其它参考2


@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中,这样我就不会在生产代码中结束它。我使用这种方法从产品构建中删除调试代码。

其它参考3


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');


[25]