Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:从第三方库访问工厂或服务_Javascript_Angularjs_Web Applications_Dependency Injection - Fatal编程技术网

Javascript AngularJS:从第三方库访问工厂或服务

Javascript AngularJS:从第三方库访问工厂或服务,javascript,angularjs,web-applications,dependency-injection,Javascript,Angularjs,Web Applications,Dependency Injection,这是我的问题:我正在构建一个应用程序,主要基于角度,但也使用一些非角度代码。我将代码组织在模块中,包括一些工厂。特别是我有一个专门用于日志记录的工厂,它被注入到各种模块中 如果我想从非angular打包代码访问这个日志工厂,而我不能从angular使用出色的依赖项注入机制,该怎么办 /* Angular app */ var app = angular.module('myApp', []); app.factory('logger', function(){ return {

这是我的问题:我正在构建一个应用程序,主要基于角度,但也使用一些非角度代码。我将代码组织在模块中,包括一些工厂。特别是我有一个专门用于日志记录的工厂,它被注入到各种模块中

如果我想从非angular打包代码访问这个日志工厂,而我不能从angular使用出色的依赖项注入机制,该怎么办

/* Angular app */
var app = angular.module('myApp', []);

app.factory('logger', function(){
   return {
       infos : [],
       logInfo : function(msg) { this.infos.push(msg); }
   };
});

app.controller('MyCtrl',['logger', function(logger){
   ...
   logger.logInfo("Here I can use the dependency-injected logger");
   ...
}]);

/* Rest of the app */

someLib.someMethod(function(){
   ...
   // var logger = angular.getFactory('logger') ?
   logger.logInfo("Gee, how do I access my logger from here?");
   ...
});
我确实找到了解决这个问题的方法,但我觉得它不太令人满意,也不安全:

// Declare the logger globally
var logger = {
  infos : [],
  logInfo : function(msg) { this.infos.push(msg); }
};

// Still package it into a factory (although it's kinda pointless now)
app.factory('logger', function(){
  return logger;
});

/* Rest of the app */
someLib.someMethod(function(){
  ...
  logger.logInfo("Now logger is global, so I can access it from anywhere!");
  ...
});

所以。。。有没有一种方法可以在代码的非角度部分注入依赖项?

我的方法是将当前的应用程序注入器分配给应用程序模块属性,以便以后很容易访问它。在运行块中执行此操作很方便:

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

app.run(function($injector) {
    app.$injector = $injector;
});
现在,稍后当您需要从非角度代码获得一些服务时,您可以执行以下操作:

var logger = app.$injector.get('logger');

因此,现在您可以使用它:

someLib.someMethod(function() {
    var logger = angular.module('myApp').$injector.get('logger');
    logger.logInfo("Now logger is global, so I can access it from anywhere!");
});
特别是对于记录器(即不与Angular的摘要周期交互的东西),我不反对您的解决方案。为了完整性,除了dfsq的答案之外,另一种方法是将所需的角度服务注入
run
块,并通过该run块将其置于全局上下文中,即
app.run(function(myService){window.myService=myService;})
someLib.someMethod(function() {
    var logger = angular.module('myApp').$injector.get('logger');
    logger.logInfo("Now logger is global, so I can access it from anywhere!");
});