1

当我处理全局错误时,我正在尝试使用 ErrorHandler 的实现来发布祝酒词。问题是吐司永远不会弹出。我在控制台中显示的 publishToast 方法中有一个 console.log,并且没有出现其他错误。

如果我在组件中创建相同的 publishToast 方法,则 toast 可以正常工作,因此它似乎与与组件的分离有关。

@Injectable()
export class AppErrorHandler implements ErrorHandler {

//---------------------------------------------------------------------//

constructor(private _toastyService: ToastyService) { }

//---------------------------------------------------------------------//

handleError(error: any): void {
    console.log("Error", error)
    alert("Error")
    this.publishToast(error, "An unexpected error occured")
}//handleError

//---------------------------------------------------------------------//

publishToast(error: any, msg?: string) {
    console.log("Publishing Toast")

    let title = "Error " + (error.statusCode ? error.statusCode : '')
    let message = msg ? msg : ''
        + error.body ? error.body : ''

    // Create the instance of ToastOptions 
    var toastOptions: ToastOptions = {
        title: title,
        msg: message,
        showClose: true,
        timeout: 5000,
        theme: 'bootstrap',
        onAdd: (toast: ToastData) => {
        },
        onRemove: function (toast: ToastData) {
        }

    };
    this._toastyService.error(toastOptions);


}//addErrorToast

}//Cls

有任何想法吗?

4

1 回答 1

5

发生这种情况是因为 handleError() 方法是在 Angular“区域”之外执行的。简单地说:Angular 不会在 handleError() 调用之后运行变化检测机制。DOM 未更新,因此 toast 不可见。

通常你不需要担心区域,但 ErrorHandler 是例外之一。如果您想运行一些需要触发更改检测的代码,您需要将其显式包装在 ngZone.run 调用中,如下所示:

import { ErrorHandler, Injectable, NgZone } from "@angular/core";
import { ToastyService } from 'ng2-toasty';

@Injectable()
export class AppErrorHandler implements ErrorHandler {
    constructor(
        private toastyService: ToastyService,
        private ngZone : NgZone) { }

    handleError(error: any): void {
        this.ngZone.run(() => {
            this.publishToast(error, "An unexpected error occured");
        });  
    }

如果您对细节感兴趣,有各种关于区域的博客文章。例如: https ://blog.thoughtram.io/angular/2016/02/01/zones-in-angular-2.html

于 2017-09-06T12:51:18.600 回答