gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:16:50 25 4
gpt4 key购买 nike

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

如果我想从非 Angular 打包代码访问这个日志工厂,而我无法使用 Angular 出色的依赖注入(inject)机制,该怎么办?

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

那么...有没有办法在代码的非 Angular 部分注入(inject)依赖项?

最佳答案

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

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

关于javascript - AngularJS:从第三方库访问工厂或服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30395557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com