2017-05-18 5 views
11

Ich habe eine Situation, in der ich ein Resolve verwendet habe, um einige Daten von einer entfernten Quelle über einen HTTP-Aufruf vorzuladen, bevor ich zu einer Komponente navigiere. Jetzt muss ich eine Schutzlogik implementieren, die abhängig von einigen Bedingungen erfordert, dass Daten vorgeladen werden, um einige Felder gegenüber dem aktuellen Benutzer zu verifizieren.Angular2 Daten von CanActivate Guard an Resolver Resolver übergeben?

Ich möchte vermeiden, genau die gleiche Anfrage an das Back-End in der CanActivate Wache und dann unmittelbar danach in der Resolve.

Gibt es eine Möglichkeit, auf die Routendaten von innerhalb der CanActivate oder die Route-Konfiguration zugreifen, um den Resolver vorübergehend zu überschreiben und nur den Wert auf das Datenobjekt, da ich habe, was ich anfordern werde?

Ich habe versucht, mit etwas so einfach wie

route.data['myData'] = value; 

wegzukommen Aber das ist ein Fehler, weil „Objekt nicht erweiterbar ist“.

Ich habe auch versucht, so etwas wie:

this.router.routerState.root.data['myData'] = value; 

Welche Fehler nicht erstellt haben, jedoch waren die Daten nicht in das route.data Element des Verfahrens Resolve.resolve() überlebt.

Ich möchte etwas zu benutzerdefiniert oder hacky wie temporäres Speichern des Objekts auf dem Dienst wie eine Art Cache vermeiden. Gibt es einen Standardmechanismus zum Übertragen von Daten zwischen internen Router-Elementen, um fortgeschrittenes Pre-Fetching und so etwas wie Dateneigentumsüberprüfungen zu unterstützen?

EDIT Die routerState funktioniert, wenn Sie den Router in den Konstruktor der Resolve Klasse, und greifen Sie auf die gleiche Weise zu injizieren. Dies muss jedoch hinterher gelöscht werden, andernfalls bleibt es zwischen Navigationsaufrufen bestehen.

Antwort

0

Die Eigenschaft data ein ActivatedRouteSnapshot unveränderlich ist, ist dies der Grund, warum Sie den Fehler erhalten:

object is not extensible

Aber man kann das ganze Objekt, so ersetzen:

@Injectable() 
export class MyGuard implements CanActivate { 
    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 

    // Use the spread operator to keep the previously resolved data 
    next.data = {...next.data, guardedData: 'guarded'}; 
    return true; 
    } 
} 

und Zugang es in Ihrem Resolver

@Injectable() 
export class FooResolver implements Resolve<any> { 

    resolve(
    route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
): Observable<any>|Promise<any>|any { 
    return route.data.guardedData; 
    } 

} 
Verwandte Themen