2015-03-02 5 views

risposta

41

di farlo iniettare il router nella ViewModel e utilizzare il metodo navigate(route)

Ecco un esempio:

import {Router} from 'aurelia-router'; 

export class MyVM { 

    static inject() { return [Router]; } 

    constructor(router){ 
    this.theRouter = router; 
    } 

    someMethod(){ 
    this.theRouter.navigate("myroute"); 
    } 
} 

un dettaglio importante è di non chiamare la proprietà router" "dopo averlo iniettato nel costruttore o genererà un'eccezione durante la navigazione su ViewModel/view

Modifica: quotin g @EisenbergEffect dalla risposta qui sotto

Il problema di denominazione con "router" è qualcosa che stiamo tracking qui: https://github.com/aurelia/router/issues/34 Se stai leggendo questo risposta più tardi, e la questione è stata chiusa, allora si dovrebbe essere in grado di in modo sicuro di denominare la proprietà "router" se lo si desidera.

+1

this.storage non è assolutamente necessario (copia-incolla da parte del mio codice) l'ho appena testato senza l'hash e sembra funzionare ma generare un hash leggermente diverso nell'URL ... "/ myroute" ti dà http: // mydomain/# myurl mentre "#/myroute" genera http: // mydomain/#/myurl ma penso che non sia necessario il "/" all'inizio quindi lo rimuovo dal codice :) –

+0

@DanielCamarda Ciao Daniel, è l'eccezione generata quando si chiama 'router' un bug? Stavo vivendo la stessa cosa e mi stava facendo impazzire. EDIT: appena individuato il post qui sotto da Rob. – Magrangs

+0

sì :) ho appena modificato la risposta per aggiungere il riferimento a @EisenbergEffect al bug –

16

po 'veloce di informazioni correlate: Il problema di denominazione con "router" è qualcosa che stiamo tracking qui: https://github.com/aurelia/router/issues/34 Se stai leggendo questa risposta più avanti, e la questione è stata chiusa, allora si dovrebbe essere in grado di nominare in modo sicuro la tua proprietà "router" se lo desideri.

+2

Per salvare chiunque controlli, @EisenbergEffect ha chiuso il problema a marzo 2015. –

17

Ho solo pensato di aggiornare l'eccellente risposta di @Daniel Camarda un po '. A partire da febbraio 2016 è possibile utilizzare il decoratore inject di Aurelia. Inoltre, il problema di denominazione router è stato risolto.

import {inject} from 'aurelia-framework'; 
import {Router} from 'aurelia-router'; 


@inject(Router) 
export class MyVM { 

    constructor(router){ 
    this.router = router; 
    } 

    someMethod(){ 
    this.router.navigate("myroute"); 
    } 
} 
4

Forse un caso d'uso leggermente differente, ma pubblicare dato che è così simile: Entrando vista, ad esempio sulla base di parametri, voglio reindirizzare a una vista diversa. Questo deve accadere in activate() o canActivate().

In questo caso, sia navigate() che navigateToRoute() suggerite sopra non funzionano.

cosa funziona però è return new Redirect('....') dove reindirizzamento è importata da Aurelia-router, in questo modo:

canActivate(param) { 
    if (param.id == null) 
     return new Redirect('/viewWhichDoesntNeedParam') 
} 
Problemi correlati