5

Vorrei passare l'utente, trovato durante il AuthorizeStep allo App class e quindi allo home module.Aurelia: durante il passaggio di un pipeline del router, come si associa una variabile a quel router?

Ecco quello che ho:

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(); 
    } 
} 

risposta

7

Nella mia app ho creato una classe chiamata AuthContext con la proprietà currentUser. È possibile iniettarlo nel costruttore per AuthorizeStep e quindi iniettarlo in altri modelli che ne hanno bisogno. Qualcosa di simile ...

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

bella soluzione! –

+0

Puoi collegarlo a un router figlio? Ricevo l'errore: i passaggi della pipeline possono essere aggiunti al router root. – smiggleworth

+2

No. "Aurelia ha due classi router, AppRouter e Router .AppRouter estende la classe Router ed è il router applicativo principale.Il router viene utilizzato per tutti i router figlio compresi i router figlio nidificati. Una delle principali differenze tra i due è che le pipeline sono solo consentito su AppRouter e non su qualsiasi router figlio. " http://aurelia.io/hub.html#/doc/article/aurelia/router/latest/router-configuration/8 – Technetium

3

ho fatto qualcosa di simile, ma ho scoperto che non posso contare sulla authcontext essere popolati in altri ViewModels per il momento il ViewModel è stato attaccato. Restituire la promessa restituita dal get e quindi restituire next() all'interno della risoluzione dello get sembra risolverlo, l'idea è di non procedere al passaggio della pipeline successivo fino a quando questo non si è risolto. Applicando che al answer da @JamesCarters, avrei avuto il seguente codice (non testato):

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

Mentre la risposta accettata affronta la domanda, credo che questo sia ciò che la maggior parte delle persone dovrebbe fare. Se hai un'istruzione che dipende dall'autorizzazione, certamente vuoi assicurarti che l'autorizzazione sia completa prima di navigare verso quell'istruzione! – Technetium