2013-02-21 24 views
17

Come posso ottenere il mio router precedente nel mio attuale controller.Come posso ottenere il mio percorso precedente?

App.MyController = Em.ObjectController.extend({ 
    next:function() { // This is my action helper in HBS 
     this.transitionTo('nextPage'); 
    }, 
    back:function() { // This is my action helper in HBS 
     // Here I need to dynamically identify my previous route. 
     // How can I get my previous route. 
    } 
}); 
+0

possibile duplicato di http: // stackoverflow.it/questions/14831668/the-route-i-came-from-or-previous-route –

+0

Sto lavorando anche a questo problema. Sarebbe bello in una successiva versione MVC se ci fosse qualcosa di simile: Request.RawUrl.PreviousRoute – JoshYates1980

+1

Basta fare 'history.back()'. È così che Ember è progettato per funzionare. Non è necessario costruire un sacco di macchinari per mantenere la propria storia. Il browser mantiene sempre il suo. –

risposta

22

Dopo aver ispezionato di nuovo l'oggetto router, non vedo alcuna proprietà in là che vi permetterà di afferrare l'ultimo percorso. Nel pre 4 c'era una proprietà per l'ultimo percorso, ma era una proprietà difficile con cui lavorare.

La mia soluzione è quindi la stessa di come era nel pre 4: creerei il mio mixin per gestire i percorsi in cui navighi, e da quell'elenco di percorsi, puoi ottenere qualunque strada tu stia cercando: quello attuale, l'ultima, eccetera ...

jsFiddle qui: http://jsfiddle.net/sMtNG/

mixin

la prima cosa da fare è creare il mixin che ci permetterà di spingere i percorsi in a HistoryController. Possiamo farlo creando un metodo setupController che ovviamente viene richiamato ogni volta che ci si sposta in una rotta.

App.HistoryMixin = Ember.Mixin.create({ 
    setupController: function() { 
     this.controllerFor('history').pushObject(this.get('routeName')); 
    } 
}); 

stiamo spingendo il percorso nella HistoryController.

Storia controller

Dal momento che stiamo attualmente spingendo la routeName in un inesistente HistoryController, avremo bisogno di andare avanti e creare quella, che è assolutamente niente di speciale.

App.HistoryController = Ember.ArrayController.extend(); 

controller Indice

Dal momento che i HistoryController memorizza l'elenco delle rotte che abbiamo navigato in, avremo bisogno accessibile su altri controller, come il IndexController, saremo perciò l'uso needs per specificare in quale controller dovrebbe essere accessibile.

App.ApplicationController = Ember.Controller.extend({ 
    needs: ['history']  
}); 

Implementare Mixin

Ora abbiamo tutto quello che serve per mantenere una traccia dei percorsi, e così noi provvederemo a specificare che i nostri percorsi devono implementare questo mixin.

App.CatRoute = Ember.Route.extend(App.HistoryMixin); 

Template

Ultimo ma non meno importante, ora che abbiamo un HistoryController cui il nostro IndexController possono accedere, e il mixin spinge ogni percorso accessibile nella HistoryController, possiamo usare la nostra visione applicazione per l'uscita un elenco dei percorsi e specificare l'ultimo percorso. Naturalmente nel tuo caso ti servirà l'ultima rotta meno uno, ma non ha senso farmi fare tutto!

<h1>Routes History ({{controllers.history.length}})</h1> 
<ul> 
    <li>Last Route: {{controllers.history.lastObject}}</li> 
    {{#each controllers.history}} 
     <li>{{this}}</li> 
    {{/each}} 
</ul> 

Spero che questo ti porti dritto e stretto.

+0

Funziona per rotte non dinamiche. Questo approccio funzionerebbe per le rotte con segmenti dinamici? – Hoetmaaiers

+0

Non hai bisogno di chiamare '_super' dal tuo' setupController' nel mixin? –

+7

Sembra troppo complicato –

Problemi correlati