5

Ich möchte den Benutzer übergeben, während der AuthorizeStep entweder App class und dann zu home module gefunden.Aurelia: Wie kann ich während eines Router-Pipeline-Schritts eine Variable an diesen Router binden?

Hier ist, was ich habe:

export class App { 
    configureRouter(config, router) { 
     config.addPipelineStep('authorize', AuthorizeStep); 
     config.map([ 
      {route: ['', ':filter'], name: "", moduleId: 'welcome'} 
      {route: 'home', name: "home", moduleId: 'home' auth:true} 
     ]); 
     this.router = router; 
    } 
} 

class AuthorizeStep { 
    run(routingContext, next) { 
     if (routingContext.nextInstructions.some(i => i.config.auth)) { 
      this.client.get('auth/login') 
       .then(response => { 
        this.user = response.content; 
       }); 
     } 
     return next(); 
    } 
} 

Antwort

7

In meiner app ich eine Klasse erstellt Eigenschaft namens AuthContext mit current. Sie können es in den Konstruktor für AuthorizeStep injizieren und es dann in alle anderen Modelle injizieren, die es benötigen. So etwas wie ...

import {AuthContext} from './auth-context'; 

export class App { 
    static inject() { return [AuthContext];} 

    constructor(authcontext){ 
     this.authContext = authcontext; 
    } 

    configureRouter(config, router) { 
     config.addPipelineStep('authorize', AuthorizeStep); 
     config.map([ 
      {route: ['', ':filter'], name: "", moduleId: 'welcome'} 
      {route: 'home', name: "home", moduleId: 'home' auth:true} 
     ]); 
     this.router = router; 
    } 
} 

class AuthorizeStep { 
    static inject() { return [AuthContext];} 

    constructor(authcontext){ 
     this.authContext = authcontext; 
    } 
    run(routingContext, next) { 
     if (routingContext.nextInstructions.some(i => i.config.auth)) { 
      this.client.get('auth/login') 
       .then(response => { 
        this.authcontext.user = response.content; 
       }); 
     } 
     return next(); 
    } 
} 
+0

Nizza Lösung! –

+0

Können Sie dies mit einem Kind-Router verbinden? Ich erhalte Fehler: Pipeline-Schritte können nur zum Root-Router hinzugefügt werden. – smiggleworth

+2

Nein. "Aurelia hat zwei Router-Klassen, AppRouter und Router. AppRouter erweitert die Router-Klasse und ist der Hauptanwendungs-Router. Router wird für alle untergeordneten Router einschließlich verschachtelter Kind-Router verwendet. Einer der Hauptunterschiede zwischen den beiden ist nur Pipelines auf dem AppRouter und nicht auf untergeordneten Routern zulässig. " http://aurelia.io/hub.html#/doc/article/aurelia/router/latest/router-configuration/8 – Technetium

3

Ich habe etwas Ähnliches getan, aber ich fand, dass ich nicht auf dem authcontext verlassen können durch die Zeit in anderen Viewmodels bevölkert wird das Ansichtsmodell angebracht wird. Die Rückgabe des von der get zurückgegebenen Versprechens und die Rückgabe next() innerhalb der Auflösung der get scheint dies zu lösen, wobei die Idee darin besteht, nicht mit dem nächsten Pipeline-Schritt fortzufahren, bis dieser gelöst ist. Die Anwendung, die auf die answer von @JamesCarters, würde ich den folgenden (ungetestet) Code erhalten:

class AuthorizeStep { 
    static inject() { return [AuthContext];} 

    constructor(authcontext){ 
     this.authContext = authcontext; 
    } 
    run(routingContext, next) { 
     if (routingContext.nextInstructions.some(i => i.config.auth)) { 
      return this.client.get('auth/login') 
       .then(response => { 
        this.authcontext.user = response.content; 
        return next(); 
       }); 
     } 
     else { 
      return next(); 
     } 
    } 
} 
+1

Während die angenommene Antwort die Frage anspricht, glaube ich, dass das die meisten Leute tun sollten. Wenn Sie eine Anweisung haben, die von der Autorisierung abhängig ist, möchten Sie sicher gehen, dass die Autorisierung abgeschlossen ist, bevor Sie zu dieser Anweisung navigieren! – Technetium

Verwandte Themen