2017-02-27 2 views
0

Ich habe bereits so ein beobachtbares Muster eingerichtet und es funktioniert normalerweise, aber wie ich es in einem benutzerdefinierten Error-Handler verwendet, funktioniert es nicht.angular2 - beobachtbar nicht streaming?

Anscheinend wird der Code im Konstruktor nie ausgeführt, aber es ist eine reguläre Klasse, ich kann onInit nicht verwenden, kann ich nicht?

edit: Ich habe versucht, den Code in eine init-Funktion zu setzen, die von der Dialogkomponente vor dem subscribe aufgerufen wird, aber wenn ein Fehler auftritt, wird handleError aufgerufen, es scheint der Kontext geändert zu haben und nichts ist definiert (beobachtbar und beobachtbar) ist nicht definiert)

benutzerdefinierte Fehlerbehandlung:

export class CustomErrorHandler implements ErrorHandler 
{ 
    public errors : Observable<Error>; 
    private errorsObserver : Observer<Error>; 

    constructor() { 

     this.errors = Observable.create((observer :Observer<Error>)=> <<<<<<THIS ONE NEVER GETS EXECUTED 
     { 
      this.errorsObserver = observer; 
     }).share(); 
    } 

    handleError(error:Error) { 
    this.errorsObserver.next(error); 
    } 
} 

@NgModule({ 
    providers: [{provide: ErrorHandler, useClass: CustomErrorHandler}] 
}) 
export class CustomErrorHandlerModule {} 

die Dialogkomponente:

@Component({ 
    moduleId: module.id, 
    selector: 'dialog', 
    templateUrl: './dialog.component.html', 
}) 
export class Dialog implements OnInit 
{ 
    private ErrorMsg: string; 
    public ErrorMessageIsVisible: boolean; 

    errorsSub:Subscription ; 

    constructor(private customErrorHandler: CustomErrorHandler) { 
    } 

    ngOnInit() 
    { 
     this.errorsSub = this.customErrorHandler.errors.subscribe(
      (error) => { 
         this.showErrorMessage(error.message); 
        }); 
    } 

    showErrorMessage(msg: string) 
    { 
     this.ErrorMsg = msg; 
     this.ErrorMessageIsVisible = true; 
    } 

    hideErrorMsg() 
    { 
     this.ErrorMessageIsVisible = false; 
    } 
} 

Antwort

0

ich denke, die Frage ist, dass Sie nicht dieselbe Instanz von CustomErrorProvider verwenden.

Ihr Provider ist Fehlerbehandler:

@NgModule({ 
    providers: [{provide: ErrorHandler, useClass: CustomErrorHandler}] 
}) 

In Ihrem Dialog müssen Sie injizieren Fehlerbehandler und Umwandlung in einen CustomErrorHandler:

constructor(errorHandler: ErrorHandler) { 
    this.customErrorHandler = errorHandler as CustomErrorHandler; 
    ... 
} 
+0

es funktioniert (die beobachtbaren Trigger), aber mein Dialog angezeigt nicht bekommen. ..in anderen Fällen funktioniert der Dialog. Wenn also eine Ausnahme ausgelöst wird, wird der Fluss irgendwie unterbrochen, oder vielleicht, weil der Fehler in einem Service passiert? –

Verwandte Themen