2017-06-09 5 views
3

Wenn ich drei Wachen auf einer Route angeben, scheint es, als ob alle Wachen sofort ausgewertet werden.Warten auf Wächter in Angular

{path: '', component: OptionsComponent, canActivate: [ GuardOne, GuardTwo, GuardThree]}

Das Problem, das ich habe, ist ich nicht GuardTwo will laufen, bis GuardOne beendet hat. Gibt es einen Weg, dies zu erreichen?

+0

Duplizieren von https://stackoverflow.com/questions/40589878/multiple-canactivate-guards-all-run -Wenn-zuerst-scheitert? – Striped

+0

@maddockst Ich fragte mich, was dich dazu zwang, deine Wache synchron zu laden? Könnten Sie das näher ausführen? –

+1

@ Z.Bagley Ich benutze Kinder Routen und wollte einen Wächter für alle diese Kinder verwenden. – maddockst

Antwort

5

Ich glaube nicht, dass das in 4.1.3 möglich ist. Here ist der Code, der die Wachen läuft:

private runCanActivate(future: ActivatedRouteSnapshot): Observable<boolean> { 
    const canActivate = future._routeConfig ? future._routeConfig.canActivate : null; 
    if (!canActivate || canActivate.length === 0) return of (true); 
    const obs = map.call(from(canActivate), (c: any) => { 
     const guard = this.getToken(c, future); 
     let observable: Observable<boolean>; 
     if (guard.canActivate) { 
     observable = wrapIntoObservable(guard.canActivate(future, this.future)); 
     } else { 
     observable = wrapIntoObservable(guard(future, this.future)); 
     } 
     return first.call(observable); 
    }); 
    return andObservables(obs); 
    } 

Dieses vereinfachte Stück:

// array of all guards 
canActivate.map((guard)=>{ 
    observable = guard.canActivate() 
}) 

läuft alle Wachen in einer Folge ohne zu warten, die vorherigen Abschluss zu.

Eine mögliche Lösung wäre, einen Dienst zu haben, die CanActivate implementiert und kombiniert andere Wachen:

class Combined { 
    constructor(private gA: GuardA, private gB: GuardB) {} 

    canActivate(r, s) { 
     return gA.canActivate(r, s).then(()=>{ return gB.canActivate() }); 
    } 
} 

... 
{path: '', component: OptionsComponent, canActivate: [ Combined ]} 
+0

So wäre es möglich, sie synchron in einem separaten Dienst zu erstellen, dann in diesem Dienst, der sie synchron baut? –

+0

Solide Antwort, aber wissen Sie, wenn diese Art von Situation benötigt wird? –

+0

was meinst du? da Sie die Frage gestellt haben, haben Sie wahrscheinlich eine solche Situation :) –

Verwandte Themen