Comment transitionToRoute
peut-il être appelé proprement depuis un composant Ember?
Cela fonctionne en injectant un contrôleur dans le composant et en appelant la fonction transitionToRoute
du contrôleur, mais j'aimerais quelque chose d'un peu plus élégant si possible.
À quoi ressemble-t-il actuellement dans le javascript du composant:
// this.controller is injected in an initializer
this.controller.transitionToRoute("some.target.route.name");
Quoi de plus agréable dans le javascript du composant:
transitionToRoute("some.target.route.name");
Un objectif est de le faire sans utiliser sendAction
car ce composant particulier a un seul but et doit toujours effectuer la transition vers le même itinéraire. Il n'est pas nécessaire que les autres artefacts Ember soient conscients de la route par laquelle ce composant est toujours transi, ni l'indirection associée. La responsabilité de la route cible appartient à ce composant.
UPDATEVeuillez consulter les réponses plus récentes pour savoir comment y parvenir avec moins de code dans les nouvelles versions d'Ember et votez pour celles-ci si elles fonctionnent pour vous - Merci!
Injectez la router
dans les composants et appelez this.get('router').transitionTo('some.target.route.name')
.
Pour injecter la router
dans tous les composants, écrivez un initialiseur à app/initializers/component-router-injector.js
avec le contenu suivant:
// app/initializers/component-router-injector.js
export function initialize(application) {
// Injects all Ember components with a router object:
application.inject('component', 'router', 'router:main');
}
export default {
name: 'component-router-injector',
initialize: initialize
};
Exemple d'utilisation dans un composant:
import Ember from 'ember';
export default Ember.Component.extend({
actions: {
submit: function() {
this.get('router').transitionTo('some.target.route.name');
}
}
});
Mise à jour du 22 janvier 2018
À partir de Ember 2.15 , la phase 1 du service de routeur public est mise en œuvre.
Transition vers une route depuis l'intérieur d'un composant:
import { inject as service } from '@ember/service';
export default Ember.Component.extend({
router: service(),
actions: {
someAction() {
this.get('router').transitionTo('index');
}
}
});
Si vous souhaitez utiliser le routeur uniquement dans un composant ou service ou controller spécifique, vous pouvez essayer ceci:
Initialiser un attribut avec le service privé -routing
. Le -
car ce n'est pas encore une API publique.
router: service('-routing'),
Et puis à l'intérieur de toute méthode d'action ou autre fonction à l'intérieur du service ou du composant:
this.get('router').transitionTo(routeName, optionalParams);
Note: Ce sera transitionToRoute
dans un contrôleur.
Vous pouvez utiliser conteneur pour accéder à n’importe quelle partie nécessaire de l’application. Pour obtenir le contrôleur d'application:
this.container.lookup('controller:application')
Mais qu’en est-il de la structure de l’application - les composants devraient générer des événements - je pense donc qu’il est préférable d’utiliser sendAction. Parce qu'à l'avenir, vous pouvez obtenir une situation lorsque vous devez filtrer un tel comportement (par exemple) ou une autre logique spécifique à l'application avant la transition.
Utilisez router: service()
au lieu de router: service('-routing')
import Component from '@ember/component';
import {inject as service} from '@ember/service';
export default Component.extend({
router: service(),
actions: {
onClick(params) {
let route = this.getMyRoute(params);
this.get('router').transitionTo(route);
}
}
});