gpt4 book ai didi

javascript - AngularJS Provider 依赖注入(inject) - 在 provider 中使用 $log

转载 作者:可可西里 更新时间:2023-11-01 02:05:47 25 4
gpt4 key购买 nike

问题很简单:使用 AngularJS 我们无法将 $log 注入(inject)提供程序。

angular.module('my.module', [])
.provider('myProvider', function ($log, $logProvider) {
$log.log("Aloha!"); // Unknown provider: $log
$logProvider.log("Hi!"); // undefined is not a function: $logProvider has no `log` method
this.$get = function($log) {
$log.log("Hello!"); // Everything is ok here
};
});

是的,我们可以注入(inject)$logProvider,但它没有所需的方法(.log.error 等)。

是的,我们可以注入(inject)$logProvider,然后手动调用$logProvider.$get(),但我们将无法使用装饰器的额外逻辑。

是的,我们可以编写自己的 logProvider,但我想知道为什么 Angular 不支持这种开箱即用的功能。

那么,我们不能在提供程序中以“真正的 Angular 方式”使用控制台吗?这个事实很奇怪。和悲伤。

问题:我需要如何在提供商中以“真正的 Angular 方式”使用控制台?

我找不到这个问题的任何解释。Angular 开发人员指南说我们需要在所有地方使用 $log 而不是控制台。

最佳答案

提供者在创建任何服务之前运行得太早,或者换句话说,提供者的 $get 是服务构造函数,它在模块的配置阶段之后被实例化(并且当它通过依赖注入(inject)第一次被访问时,注入(inject)器实例化构造函数并将其保持为单例)。提供程序在配置阶段期间或之前运行(因为提供程序方法用于在模块的 config 阶段配置服务)。这意味着 $log 服务还不可用。

$logProvider.$get 将为您提供日志服务的构造函数,您可以自己通过调用 $injector.instantiate($logProvider.$get) 创建它的实例> 但问题在于它依赖于尚未实例化的窗口服务,因此最终您的记录器实例化将失败。

所以我能想到的一种方法是从另一个注入(inject)器获取 $log,即 angular.injector(['ng']).get('$log')

angular.module('my.module', [])
.provider('myProvider', function ($log, $logProvider) {
var $log = angular.injector(['ng']).get('$log');
$log.log("Aloha!");

this.$get = function($log) {
$log.log("Hello!"); // Everything is ok here
};
});

Plnkr

或者另一种方法就是疯狂地自己实例化它,在这种情况下实例化它的依赖服务它只是 $window (或者甚至提供 global window 对象作为本地人)。

 .provider('myProvider', function ($logProvider,$injector, $windowProvider) {
//get window service, if you want to really provide window service instance itself, or just provide the global window object
var window = $injector.instantiate($windowProvider.$get);
//Get log provider providing locals for $window
var $log = $injector.instantiate($logProvider.$get,{$window:window})

$log.log("Aloha!");// Everything is ok here too

this.$get = function($log) {
$log.log("Hello!"); // Everything is ok here
};

});

Plnkr

只是添加一个不同的注意事项:在应用程序的配置阶段尝试访问 $log 服务时,您也会看到相同的行为。但有时由于 decorators 的工作方式,您仍然可以通过使用虚拟装饰器强制早期创建服务来利用它。

即:

.config(function($provide){
//Just a dummy decorator
$provide.decorator('$log', function($delegate){
return $delegate;
});

}).config(function($logProvider){
//get logger instance
var log = $logProvider.$get();
log.debug("Got it");
});

Plnkr

所以最终的想法是,当您需要在实例化之前使用服务时,您需要通过解析其所有依赖项等来手动实例化它。

关于javascript - AngularJS Provider 依赖注入(inject) - 在 provider 中使用 $log,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620927/

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