2016-12-15 4 views
0

ich einen CanDeactivate Schutz für meine Angular App geschrieben haben, die ziemlich einfach ist:Angular 2 Router 3.0 Zukünftige Routen in CanDeactivate Wache

@Injectable() 
export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate> { 
    canDeactivate(component: CanComponentDeactivate): Promise<boolean> | boolean { 
     return component.canDeactivate ? component.canDeactivate() : true; 
    } 
} 

es nur für ein Versprechen wartet auf wahr/falsch zu lösen, oder eine sofortige wahr/false wird zurückgegeben. Was ich jedoch tun möchte, ist in der Komponente, in der die Wache platziert ist, die zukünftige Route zu überprüfen. Nehmen wir zum Beispiel an, ich habe drei Routen, /list, /shop, /checkout, und ich setze die canDeactivate Schutzvorrichtung auf /shop. Ich will es dort, denn wenn sie diese Komponente verlassen, möchte ich sie fragen, ob sie sicher sind, dass sie gehen wollen. Aber wenn sie gehen, um zur Kasse zu gehen, möchte ich sie nicht fragen, ob sie sicher sind. Ich würde nur sofort eine Antwort auf die canDeactivate Wache zurückgeben. Wenn sie jedoch zurück zu /list gehen, frage ich sie vielleicht, ob sie sicher sind, dass sie die Artikel in ihrem Einkaufswagen lassen wollen.

Ich habe mehrere Fragen nachgeschlagen, einschließlich this one, und lesen Sie die Dokumente auf der Angular site, aber habe nicht gefunden, was ich suche.

Mein Gedanke wäre, dass in der tatsächlichen Komponente, in der canDeactivate Methode, ich in der Lage wäre, den Router oder die zukünftige Route oder etwas in diesen Zeilen zu überprüfen, um zu sehen, was es ist und sehen, ob ich sofort wieder wahr von der Wache.

Irgendwelche Ideen dazu?

+0

Sie kostenlos in einige Click-Handler, die router.navigate für die Navigation verwenden und die URL speichern, die in der 'canDeactivate'-Methode verwendet werden kann, um je nach Bedarf true \ false zurückzugeben. –

Antwort

0

Es ist ein magischer, geheimnisvoll, optionalen Parameter in der CanDeactivate Schnittstelle, die Sie genau das, das, was Sie suchen ... nextstate

interface CanDeactivate<T> { 
    canDeactivate(component: T, currentRoute: ActivatedRouteSnapshot, 
    currentState: RouterStateSnapshot, nextState?: RouterStateSnapshot): 
    Observable<boolean>|Promise<boolean>|boolean 
} 

SRC :: https://angular.io/api/router/CanDeactivate