当前位置:  开发笔记 > 前端 > 正文

Angular2在自定义ErrorHandler中注入服务

如何解决《Angular2在自定义ErrorHandler中注入服务》经验,为你挑选了1个好方法。

我有以下代码:

app.module.ts:

NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        RouterModule,
        BrowserModule,
        ReactiveFormsModule,
        FormsModule,
        HttpModule,
        AppRoutingModule // Routes
    ],
    providers: [ // services
        AppLog,
        {provide: ErrorHandler, useClass: MyErrorHandler}
    ],
    bootstrap: [AppComponent]
})
export class AppModule {}

MyErrorHandler.ts:

@Injectable()
export class MyErrorHandler implements ErrorHandler {
  constructor (private _appLog: AppLog) {}

  handleError(error:any):void {
    let errorMessage: string = "" + error
    this._appLog.logMessageAsJson(errorMessage, "error")
            .subscribe(
              ...
            )
  }
}

appLog.ts

@Injectable()
export class AppLog {
    constructor (private _http: Http) {}

    logMessageAsJson(message: string, type: string) {
        let headers = new Headers({ "Content-Type": "application/json" })
        let jsonMessage = {"type": type, "message": message}

        return this._http.post(JSON.stringify(jsonMessage), headers)
    }
}

但是,当我的应用程序引导时,如果我注入MyErrorHandler了以下错误,则会失败:

Unhandled Promise rejection: Provider parse errors:
Cannot instantiate cyclic dependency!

如果我删除constructor (private _appLog: AppLog) {}然后在handleError其中执行其他操作就可以正常工作并调用ErrorHandler.

我想这不起作用,因为AppLog和MyErrorHandler同时被实例化



1> Günter Zöchb..:

您可以使用此变通方法来分解与DI的循环依赖关系

@Injectable()
export class MyErrorHandler implements ErrorHandler {
  private _appLog: AppLog;
  constructor (injector:Injector) {
    setTimeout(() => this._appLog = injector.get(AppLog));
  }
  ...
}

Angulars DI本身不支持循环依赖.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有