Je dois obtenir le nom de la route actuelle dans mon application ember; J'ai essayé ceci: Ember App.Router.router.currentState undefined mais cela ne fonctionne pas pour moi (il y a probablement quelque chose qui me manque ...) J'utilise Ember rc6 et j'ai une application multilingue; dans la route d'application, je détecte la langue du navigateur et je redirige vers la bonne page avec:
this.transitionTo(userLang);
mais je voudrais que ceci ne soit exécuté que lorsque l'utilisateur est sur la page d'accueil, quelque chose comme ceci:
if (currentRoute == 'home'){
this.transitionTo(userLang)
}
Vous pouvez observer la variable application
's currentPath
et la définir en conséquence sur l'itinéraire actuel lorsqu'il change:
App = Ember.Application.create({
currentPath: '',
});
App.ApplicationController = Ember.Controller.extend({
updateCurrentPath: function() {
App.set('currentPath', this.get('currentPath'));
}.observes('currentPath')
}),
De cette façon, vous avez accès à la currentPath
quand vous le voulez avec App.get('currentPath');
Par exemple.
if (App.get('currentPath') == 'home'){
this.transitionTo(userLang);
}
J'espère que ça aide.
Cela a fonctionné pour moi sur la version 1.3.0-beta (et un coup d’œil rapide sur la source de la version 1.1.2 suggère que cela fonctionnerait également là):
App.__container__.lookup('router:main').location.lastSetURL
Notez que la documentation indique:
At present, it relies on a hashchange event existing in the browser.
Cependant, je crois qu'il est fortement suggéré que App.__container__
ne soit pas utilisé dans le code de production. Une alternative plus acceptable consisterait à utiliser App.Router.router.currentHandlerInfos
, qui fournit des informations sur l'itinéraire Ember actuel.
Une autre option est currentRouteName
sur ApplicationController
. Vous pouvez ajouter needs: ['application']
à votre contrôleur, puis accéder au nom de la route avec controllers.application.currentRouteName
. Cela retournera quelque chose comme posts.index
.
Avec le passage aux composants, il est plus difficile d’obtenir le nom de la route. Le meilleur moyen est d’ajouter un initialiseur tel que
ember g initializer router
(depuis la ligne de commande), et
export function initialize(application) {
application.inject('route', 'router', 'router:main');
application.inject('component', 'router', 'router:main');
}
export default {
name: 'router',
initialize
};
dans un initializers/router.js. Vous pouvez également injecter dans le contrôleur si vous en avez besoin. Alors faites simplement
this.get('router.currentRouteName');
en JS, ou
{{router.currentRouteName}}
dans le modèle.
C’est le seul moyen que j’ai trouvé pour l’obtenir de manière fiable et observable dans Ember 2.4
Si vous souhaitez obtenir la route actuelle dans votre composant ou contrôleur, vous pouvez injecter un service de routage (routing: Ember.inject.service('-routing')
)
(pour more ) et utiliser:
this.get('routing.currentRouteName')
ou this.get('routing.currentPath')
Exemple avec composant et propriété calculée:
import Ember from 'ember';
export default Ember.Component.extend({
routing: Ember.inject.service('-routing'),
checkMyRouteName: Ember.computed('routing.currentRouteName', function() {
return this.get('routing.currentRouteName');
})
})
Exemple avec contrôleur et propriété calculée:
import Ember from 'ember';
export default Ember.Controller.extend({
routing: Ember.inject.service('-routing'),
checkMyRouteName: Ember.computed('routing.currentRouteName', function() {
return this.get('routing.currentRouteName');
})
})
Itinéraire actuel sur votre itinéraire dont vous avez simplement besoin this.routeName
Exemple avec route:
import Ember from 'ember';
export default Ember.Route.extend({
checkMyRouteName() {
return this.routeName;
}
})
Juste comme une mise à jour, dans Ember 1.8.1, nous pouvons obtenir le nom de route dans un objet Ember.Route en faisant this.routeName
.
L'API de l'espace de noms Ember a maintenant une méthode getOwner
, ce qui est très utile pour rechercher les propriétés currentRouteName
ou autres.
const owner = Ember.getOwner(this);
const currentRoute = owner.lookup('router:main').currentRouteName;
const routeInfo = owner.lookup(`route:${currentRoute}`).get('info');
// etc.
J'ai créé un Ember Twiddle exemple à illustrer. Utilisez la saisie de texte située au-dessus du volet "Sortie" pour choisir d'autres itinéraires tels que /blue
, /green
ou /red
.
Actuellement à partir de Ember 1.7.0, vous pouvez obtenir l'itinéraire actuel à partir d'un itinéraire en appelant this.routeName
.
J'ai eu le même problème pendant un moment. alors j'ai commencé à explorer le routeur. Il a toujours un objet d'état qui peut être obtenu à partir de n'importe quel itinéraire en utilisant
var route = this;
var handlerInfos = route.get("router.router.state.handlerInfos");
var currRouteHandlerInfo = handlerInfos[handlerInfos.length-1];
var currRouteName = currRouteHandlerInfo.name; //"home"
c'est tout. Maintenant vous avez le nom actuel de la route!
si vous voulez les paramètres de route actuels,
var routerParams = this.get("router.router.state.params");
var currRouteParams = routerParams[currRouteName]; //{ homeId : "1" }