Ich habe eine Komponente mit einer Schaltfläche Abbrechen. Wenn diese getroffen wird, die gotoParent() wird aufgerufen:Angular 2 canDeactivate ist nicht immer Routing
canDeactivate(): Promise<boolean> | boolean {
return this.dialogService.confirm('Discard changes?');
}
private gotoParent() {
let orgId = this.org ? this.org.id : -1;
this.router.navigate(['../', { id: orgId }], { relativeTo: this.route });
console.info("orgId: " + orgId);
}
cancel() {
this.gotoParent();
}
Weil ich einen Deaktivierungsschutz für die Strecke realisiert habe ich (in der Regel) einen Dialog:
@Injectable()
export class DialogService {
confirm(message?: string) {
return new Promise<boolean>(resolve => {
return resolve(window.confirm(message || 'Is it OK?'));
});
};
}
Mein Problem ist, dass diese Werke Einmal. Wenn ich die Komponente Abbrechen ein zweites Mal klicke, bekomme ich keine Antwort - kein Dialog. Auch die Schaltfläche Speichern der Komponente funktioniert nicht.
Wenn ich meinen Code verfolgen sehe ich die router.navigate() ausgeführt wird - die console.info() ist da, also kann ich einen Haltepunkt setzen - aber das Dialogfeld erscheint nicht und die Anwendung nicht navigieren.
An dieser Stelle kann ich auf einige "Master" klicken, um zum Stamm der Anwendung zu gehen. Dann bekomme ich diesen Dialog erneut. Wenn ich auf den Dialog Abbrechen für diese Instanz des Dialogs klicke, dann hört auch das auf zu arbeiten.
Was sollte passieren, ist der Dialog Abbrechen sollte mich in der aktuellen Komponente anzeigen lassen, bereit, den Dialog wieder anzuzeigen.
Dies funktionierte im ursprünglichen Tutorial, aber nicht nachdem ich die Dinge für meine eigenen Zwecke geändert habe. Hat jemand eine Ahnung für mich?
Danke, Jerome.
EDIT: Beantworten YairTawil erfordert mehr Platz, als ein Kommentar liefern könnte.
Hier sind meine Ereignisse, nachdem ich den Listener für Ereignisse eingefügt.
Navigieren aus dem globalen Menü in edit-org:
event = NavigationEnd {id: 4, url: "/provider/edit-org", urlAfterRedirects: "/provider/edit-org"}
Klicken Sie auf Komponente Abbrechen:
event = NavigationStart {id: 5, url: "/provider;id=12"}
org-detail.component.ts:67 event = RoutesRecognized {id: 5, url: "/provider;id=12", urlAfterRedirects: "/provider;id=12", state: RouterStateSnapshot}
(Die id = 12 ein Tutorial Trick ist, die Eltern zu erzählen, die ID gearbeitet wurde . auf)
Klicken Sie auf Dialog abbrechen:
org-detail.component.ts:67 event = NavigationCancel {id: 5, url: "/provider;id=12", reason: ""}
Zurück zur Komponente.
Klicken Sie erneut auf die Komponente Abbrechen. Kein Event. Klicken Sie auf die Komponente Speichern. Kein Event.
Durch Klicken auf eine globale Menüwahl „Provider“ liefert diese Ereignisse:
event = RoutesRecognized {id: 6, url: "/provider", urlAfterRedirects: "/provider", state: RouterStateSnapshot}
org-detail.component.ts:67 event = NavigationCancel {id: 6, url: "/provider", reason: ""}
Nach dem Einschalten Dialog klicken Abbrechen der globale Menü-Provider nicht mehr funktioniert. Es ist, als ob etwas gelöscht oder zurückgesetzt werden möchte.
I kann zuverlässig jedes Mal das Ereignis auslösen, indem Sie abwechselnd auf die Komponente Abbrechen, Dialog Abbrechen klicken, dann das globale Menü Provider, dann den Dialog Abbrechen, dann wiederholen. Aber aufeinanderfolgende Klicks auf die Sammlung von Komponentenschaltflächen, wie z. B. (Komponente Abbrechen, Dialogfeld Abbrechen, dann Komponente Abbrechen), führen nicht zu diesem zweiten Dialog.
Weitere Ideen?
Hieronymus.