Ember transitionToRoute чисто в компоненте без sendAction
Как transitionToRoute
можно назвать чисто изнутри компонента Ember?
Он работает с введением контроллера в компонент и вызовом функции контроллера transitionToRoute
, однако мне хотелось бы немного более элегантно, если это возможно.
В настоящее время он выглядит внутри компонента javascript:
// this.controller is injected in an initializer
this.controller.transitionToRoute("some.target.route.name");
Что будет лучше в компоненте javascript:
transitionToRoute("some.target.route.name");
Одна цель - сделать это без использования sendAction
, поскольку этот конкретный компонент имеет одну цель и должен всегда переходить на один и тот же маршрут. Нет необходимости в том, чтобы другие артефакты Ember знали о маршруте, к которому этот компонент всегда переходит, нет необходимости в соответствующей косвенности. Ответственность за целевой маршрут принадлежит этому компоненту.
Ответы
Ответ 1
Внесите router
в компоненты и вызовите this.get('router').transitionTo('some.target.route.name')
.
Чтобы ввести router
во все компоненты, напишите инициализатор в app/initializers/component-router-injector.js
со следующим содержимым:
// 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
};
Использование образца в компоненте:
import Ember from 'ember';
export default Ember.Component.extend({
actions: {
submit: function() {
this.get('router').transitionTo('some.target.route.name');
}
}
});
Ответ 2
Вы можете использовать контейнер, чтобы получить доступ к любой необходимой части приложения. Чтобы получить контроллер приложения:
this.container.lookup('controller:application')
Но как насчет структуры приложения - компоненты должны генерировать события - так что мое мнение лучше использовать sendAction. Причина в будущем вы можете получить ситуацию, когда вам необходимо отфильтровать такое поведение (например) или другую логику приложения до перехода
Ответ 3
Если вы хотите использовать маршрутизатор только в специальном компоненте или службе или контроллере, вы можете попробовать следующее:
Инициализировать атрибут с помощью частной службы -routing
. -
, потому что это еще не открытый API.
router: service('-routing'),
И затем внутри любого метода действия или другой функции внутри службы или компонента:
this.get('router').transitionTo(routeName, optionalParams);
Примечание: в контроллере будет transitionToRoute
.