Подтвердить что ты не робот

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 знали о маршруте, к которому этот компонент всегда переходит, нет необходимости в соответствующей косвенности. Ответственность за целевой маршрут принадлежит этому компоненту.

4b9b3361

Ответ 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.