尝试将toastr添加到自定义记录器时发现循环依赖关系

时间:2015-12-01 03:57:48

标签: typescript toastr

我一直在尝试使用John Papa演示的方法,我有一个异常处理程序,这个异常处理程序调用了一个记录器类。然后,此记录器可以执行不同的操作,例如记录到控制台,数据库或toastr消息。我已经完成了所有工作,但我无法弄清楚的是,只要我添加toastr参考,我得到以下消息。

[$injector:cdep] Circular dependency found: $rootScope <- $q <- $$AnimateRunner <- $$animateQueue <- $animate <- toastr <- logger <- $exceptionHandler <- $rootScope

我正在使用TypeScript进行设置,而我在toastr引用中唯一的其他位置是在模型设置中,我将依赖性传递给记录器,并且我还有一个配置函数暴露在设置多士炉配置的位置。

toastrConfig.$inject = ['toastrConfig'];
/** @ngInject */
export function toastrConfig(toastrConfig: ToastrOptions) {
// var toastrConfig = toastr.options;
(<any>toastrConfig).allowHtml = true;
toastrConfig.timeOut = 3000;
toastrConfig.positionClass = 'toast-top-right';
toastrConfig.progressBar = true;
}


angular
    .module('blocks.logger', ['toastr'])
    .service('logger', Logger);

然后我尝试做一些简单的事情:

export class Logger implements ILogger {
static $inject: Array<string> = ['toastr'];
constructor(private toastr) { }

log(...args: any[]) {
    ////this.$log.log(args);
}

error(message: string, data?: {}, title?: string) {
    toastr.error(message);
}

我无法看到我在哪里加倍依赖。有什么想法吗?由于错误,它看起来像我循环回$ rootScope但我不知道如何。我猜它与exceptionHandlerProvider设置有关,所以这就是。

import { ILogger } from '../logger/logger';

// The exceptionHandler provider handles any unhandled exceptions and logs the exception to the console window
 // then calls the Logger to log the exception to the server side

 export interface IExceptionHandlerConfig {
appErrorPrefix: string
}
export class ExceptionHandlerProvider {
static $inject: Array<string> = [];
constructor() { }

config: IExceptionHandlerConfig = {
    appErrorPrefix: undefined
}

configure(appErrorPrefix: any) {
    this.config.appErrorPrefix = appErrorPrefix;
}

$get: () => { config: IExceptionHandlerConfig } = () => { return { config: this.config }; }
}

exceptionHandlerProviderConfig.$inject = ['$provide'];
export function exceptionHandlerProviderConfig($provide:     ng.auto.IProvideService) {
$provide.decorator('$exceptionHandler', extendExceptionHandler);
}

extendExceptionHandler.$inject = ['$delegate', 'exceptionHandler', 'logger'];

function extendExceptionHandler($delegate: ng.IExceptionHandlerService,
exceptionHandlerProvider: ExceptionHandlerProvider,
logger: ILogger) {
return function (exception: any, cause: any) {
    var appErrorPrefix = exceptionHandlerProvider.config.appErrorPrefix || '';
    var errorData = { exception: exception, cause: cause };
    exception.message = appErrorPrefix + exception.message;
    $delegate(exception, cause);    // Logs to the console

    /**
     * Could add the error to a service's collection,
     * add errors to $rootScope, log errors to remote web server,
     * or log locally. Or throw hard. It is entirely up to you.
     * throw exception;
     *
     * @example
     *     throw { message: 'error message we added' };
     */
    logger.error(exception.message, errorData);
};
}

1 个答案:

答案 0 :(得分:0)

在您的记录器类中,您有:

error(message: string, data?: {}, title?: string) {
    toastr.error(message);
}

toastr是在课程范围内定义的,因此您需要通过以下方式引用它:

this.toastr.error(message);