2015-06-07 2 views
26

Как можно назвать transitionToRoute чистотой внутри компонента Ember?Ember transitionToRoute чисто в компоненте без sendAction

Он работает с введением контроллера в компонент и вызовом функции контроллера transitionToRoute, однако мне хотелось бы немного более элегантным, если это возможно.

Что она в настоящее время выглядит как внутри JavaScript компонента:

// this.controller is injected in an initializer 
this.controller.transitionToRoute("some.target.route.name"); 

Что бы лучше в JavaScript компонента:

transitionToRoute("some.target.route.name"); 

Одной из целей является сделать это без использования sendAction как этот конкретный компонент имеет единственную цель и всегда должен переходить на тот же маршрут. Нет необходимости в том, чтобы любые другие артефакты Ember знали о маршруте, к которому этот компонент всегда переходит, нет необходимости в соответствующем косвенности. Ответственность за целевой маршрут принадлежит этому компоненту.

+0

связанный с этим вопрос, который может представлять интерес для читателей: http://stackoverflow.com/questions/22389384/transitiontorouteroute-from-inside-component –

ответ

3

Вы можете использовать контейнер, чтобы получить доступ к любой необходимой части приложения. Чтобы получить контроллер приложения:

this.container.lookup('controller:application') 

Но что о структуре приложения - компоненты должны генерировать событие - так что мое мнение, что лучше использовать sendAction. Причина в будущем вы можете получить ситуацию, когда вам нужно фильтровать такое поведение (например) или другое приложение, реализующий логику до перехода

+1

Это не рекомендуется, поскольку он использует внутренний API, который может сломаться. На самом деле доступ к контейнеру стал устаревшим на Ember 2.3, я думаю, и теперь он заменен другим интерфейсом ('getOwner' я думаю). – Ernesto

64


UPDATE Пожалуйста, смотрите другие более поздние ответы о том, как добиться этого с меньшим количеством кода в новых версиях Ember и проголосовать за них, если они сработают для вас - Спасибо!



Инжектируйте 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'); 
    } 
    } 
}); 
+7

для инъекций только в одном компоненте: http://stackoverflow.com/a/33335230/273743 –

+0

Это действительно работает, спасибо Элиот Сайкс –

+1

Для читателей 2017 года. Проблема с 'sendAction' заключается в том, что вам нужно продолжать пузыриться если ваши компоненты вложены. Если вы можете отправить действие непосредственно на маршрут из компонента, он станет недействительным. У Ember в конечном итоге будут маршрутизируемые компоненты, которые позволят вам напрямую поговорить с маршрутом. До тех пор используйте «ember-route-action-helper» для вызова метода непосредственно на маршруте, на котором существует ваш компонент, например «transitionTo (« имя-маршрут »)». Подробнее здесь: http://dockyard.com/blog/2016/02/19/best-practices-route -actions – PhillipKregg

3

Если вы хотите использовать только маршрутизатор в конкретном компоненте или сервис или контроллер, вы можете попробовать t его:

Инициализировать атрибут с помощью частного сервиса -routing. -, потому что это еще не публичный API.

router: service('-routing'), 

И тогда внутри любого метода действия или другой функции внутри службы или компонента:

this.get('router').transitionTo(routeName, optionalParams); 

Примечание: Это будет в контроллере transitionToRoute.

2

22 января 2018 Обновление
По состоянию на Ember 2.15, фаза 1 из public router service реализуется.
Переход к маршруту внутри компонента:

import { inject as service } from '@ember/service'; 

export default Ember.Component.extend({ 
    router: service(), 

    actions: { 
    someAction() { 
     this.get('router').transitionTo('index'); 
    } 
    } 

}); 
Смежные вопросы