我一直在尝试使用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);
};
}
答案 0 :(得分:0)
在您的记录器类中,您有:
error(message: string, data?: {}, title?: string) {
toastr.error(message);
}
但toastr
是在课程范围内定义的,因此您需要通过以下方式引用它:
this.toastr.error(message);