簡體   English   中英

AngularJS:從第三方庫訪問工廠或服務

[英]AngularJS: Access a factory or service from 3rd party library

這是我的問題:我正在構建一個主要基於角度的應用程序,但也使用了一些非角度代碼。 我已經在模塊(包括一些工廠)中組織了代碼。 特別是我有一個專門用於日志記錄的工廠,該工廠注入了各種模塊。

如果我想從非角度打包的代碼訪問此日志記錄工廠,而又無法從角度使用出色的依賴注入機制怎么辦?

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

那么...有沒有辦法在代碼的非角度部分注入依賴關系?

我要做的方法是將當前的應用程序注入程序分配給應用程序模塊屬性,以便以后可以輕松訪問它。 在run塊中這樣做很方便:

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

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

現在,以后需要從非角度代碼獲取某些服務時,可以執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM