2015-10-25 8 views
5

Sto usando ember-cli 1.13.8 e ho un servizio che gestisce gran parte della mia logica. In questo momento ho una funzione che ascolta se certe cose sono vere o false e quindi può fare un cambio di rotta in base a quello. Preferirei non dover chiamare quella funzione dall'interno di ogni rotta poiché voglio che accada su ogni percorso. Il suo obiettivo è determinare se il giocatore ha vinto e ogni interazione nel gioco lo guida.È possibile effettuare una transizione di percorso all'interno di un servizio in Ember?

All'interno del mio servizio di gioco:

init() { 
    ... 
    if(true) { 
    console.log("you've won!"); 
    this.transitionTo("congratulations"); 
    } 
}, 

Naturalmente, questo non riesce a causa this non è una via come Ember si aspetta. So che posso chiamare questo metodo dall'interno di ogni percorso, ma mi chiedo se c'è un modo migliore per farlo.

Grazie

Modifica

Finora ho provato ad importare in App e poi cercando di estendere il router. Questa mi sembra una cattiva idea.

risposta

23

È possibile utilizzare il servizio di routing (che è un privato API):

routing: Ember.inject.service('-routing'), 

init() { 
    ... 
    if(true) { 
    console.log("you've won!"); 
    this.get("routing").transitionTo("congratulations"); 
    } 
}, 
+0

Wow, ok, dovrò provare questo. Non ero a conoscenza di questo. – user3162553

+0

Funziona! Esattamente quello di cui avevo bisogno. – user3162553

+0

Funziona in ember 2.x? Mi sta solo dicendo che il routing non è definito in Ember 2.4.0. – mikeLspohn

9

Come di Ember 2.15, c'è un router servizio pubblico proprio per questo caso d'uso. Basta aggiungere router: Ember.inject.service(), alla classe Ember e chiamare this.get('router').transitionTo(...);, facile!


In genere questa è una cattiva idea, ma in alcuni casi è più facile che passare attraverso azioni di percorso in 100 luoghi (esperienza personale).

Il modo migliore per fare questo da qualsiasi luogo è quello di guardare il router sul contenitore:

Ember.getOwner(this).lookup('router:main').transitionTo(...); 

this deve essere qualche contenitore allocato oggetto Ember, che include componenti, servizi e modelli di Ember dati.

Si noti inoltre che se questo verrà chiamato molto, sarà necessario memorizzare il router come proprietà. È possibile farlo nel gancio init:

init() { 
    this._super(...arguments); 
    this.set('router', Ember.getOwner(this).lookup('router:main')); 
} 
... 
this.get('router').transitionTo(...); 

Ember.getOwner(this) opere in Ember 2.3+, prima di che è possibile utilizzare invece this.get('container').

+0

Ogni ricerca può essere un'operazione costosa, quindi se possibile aggiornare la risposta con il suggerimento del grafo fornito in questo [link] (https://gist.github.com/grapho/dfa357c63ab3b6c87970d0804a49efd4) – kumkanillam

+0

Ottimo punto, grazie. – DuBistKomisch

0

Ember 1.13:

Creare un altro servizio chiamato di routing:

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    _router: null, 

    init() { 
     this._super(); 

     this.set('_router', this.get('container').lookup('router:main')); 
    }, 

    transitionTo() { 
     this.get('_router').transitionTo(...arguments); 
    } 
}); 

Quindi è possibile:

routing: Ember.inject.service(), 

goSomewhere() { 
    this.get('routing').transitionTo('index'); 
} 
Problemi correlati