Quando un'eccezione viene catturata dal gestore di eccezioni di Angular 2, l'interfaccia utente non viene più aggiornata. Ho un esempio molto semplice qui:Angular 2 non aggiorna la vista dopo l'eccezione Viene generata
https://plnkr.co/edit/iHDYpZ3fDlO6bhOtlTbQ
import { Component, ExceptionHandler, Injectable, OnInit, provide } from '@angular/core';
import { bootstrap } from '@angular/platform-browser-dynamic';
import { Subject } from 'rxjs/Subject'
export interface Alert {
message: string;
}
@Component({
selector: 'my-app',
template : `
<h3>Parent</h3>
{{aValue}}
<br/>
<br/>
<button (click)='doIt()'>do it</button>
<br/>
<br/>
<button (click)='breakIt()'>break it</button>
`
})
export class App implements OnInit {
private aValue: boolean = true
constructor() { }
alerts: Alert[] = [];
doIt(){
console.log('Doing It')
this.aValue = !this.aValue
}
breakIt(){
console.log('Breaking It')
throw new Error('some error')
}
}
bootstrap(App).catch(err => console.error(err));
Il pulsante Esegui ribalta l'booleano che si riflette nel valore interpolato nel modello. Tuttavia, una volta premuto il pulsante Interrompi (in caso di errore da generare), il valore interpolato non viene più aggiornato quando viene premuto il pulsante "Esegui". Tuttavia, la console registra ancora i messaggi "Eseguendo".
Il problema ho a che fare è Vorrei creare un gestore di eccezioni personalizzato che avvisa l'utente e, eventualmente, non certo lavoro per cancellare una forma quando qualcosa è andato storto, ma quello che sto vedendo è che se mi passi un errore su un pulsante fai clic per testarlo, tutti gli aggiornamenti dell'interfaccia utente si interrompono. Tuttavia, i pulsanti continuano a funzionare, il che significa che tutti i pulsanti che inviano richieste lo faranno se il modulo è in buono stato. L'interfaccia utente tuttavia ha smesso di aggiornare e informare l'utente di ciò che sta accadendo.
Non sono sicuro se questo è un problema con Zone o altro, ma il tentativo di un NgZone.run() non sembra risolvere il problema per me. Se si intende un errore per interrompere l'interfaccia utente di un componente, qual è l'approccio corretto al mio problema?
Vedi anche http: // STA ckoverflow.com/questions/37793276/angular-2-custom-exceptionhandler-change-detection-lag/37793791#37793791 –
Interessante. La differenza che sto vedendo è che l'errore è stato generato da un componente figlio e la sua vista del plunker continua ad aggiornarsi. Questo significa che ho solo bisogno di provare ... catturare il componente principale e tutti gli errori dei componenti figlio non causeranno la rottura della vista? –
Non penso sia facile fare una dichiarazione generale.Questo dipende sempre da dove è stato chiamato il codice da cui viene chiamato e se questo rompe qualcosa se è stato chiamato un codice ma non è stato completato con un percorso previsto. –