2015-06-07 24 views
26

transitionToRoute如何从Ember组件内部干净地调用?Ember transitionTo在没有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('name-of-route')'。请阅读更多信息: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

2018年1月22日更新
作为Ember 2.15,所述public router service第1阶段中实现。
过渡到路线从组件内部:

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

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

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

}); 
相关问题