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

时间:2015-05-22 11:29:44

标签: javascript angularjs web-applications dependency-injection

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

如果我想从非角度打包的代码访问这个日志工厂怎么办?我不能使用角度很好的依赖注入机制?

/* 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!");
  ...
});

那么......有没有办法在代码的非角度部分注入依赖项?

1 个答案:

答案 0 :(得分:1)

我这样做的方法是将当前的应用程序注入器分配给应用程序模块属性,以便以后可以轻松访问它。在运行块中这样做很方便:

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

app.run(function($injector) {
    app.$injector = $injector;
});

现在,稍后当你需要从非Angular代码获得一些服务时,你可以这样做:

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

var logger = angular.module('myApp').$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!");
});