web-dev-qa-db-fra.com

Obtenir le nom de l'itinéraire actuel dans Ember

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)
}
13
Cereal Killer

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.

17
intuitivepixel

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.

25
Linda

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

17
Xeridea

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;
  }
})
15
Hubert Olender

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

13
Gjaldon

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.

3
jacefarm

Actuellement à partir de Ember 1.7.0, vous pouvez obtenir l'itinéraire actuel à partir d'un itinéraire en appelant this.routeName.

3
dannytenaglias

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" }
0
Mohan Kumar