2015-05-12 194 views
6

根据当前的路由名称,我需要将“活动”类应用于引导选项卡。路由对象包含“routeName”,但是如何从控制器或组件访问此路由对象?访问控制器或组件的当前路由名称

+1

可能this.controllerFor('application')。get('currentRouteName') – blessenm

+0

@blessenm是的,这几乎是我想要的 – jax

+0

烬将为你做这个。只需在您的标签上使用link-to – killebytes

回答

2

为灰烬2,从控制器,你可以试试:

appController: Ember.inject.controller('application'), 
currentRouteName: Ember.computed.reads('appController.currentRouteName') 

然后您可以将它传递给组件。

4

在绝对绝望的情况下,您可以通过组件内的this.container.lookup("router:main")this.container.lookup("controller:application")来查找路由器或应用程序控制器(它暴露'currentRouteName'属性)。

如果这对我来说是一个普遍的趋势,我会做一个CurrentRouteService并将它注入到我的组件中,这样我就可以在测试中更容易地嘲笑事物。

可能还有更好的答案 - 但container.lookup()应该打倒你目前的阻止者。

+3

它为我返回undefined:'this.container.lookup(“router:main”)。get('currentRouteName')' – jax

9

使用这个this.controllerFor('application').get('currentRouteName');

+4

这是否从组件工作? – Huafu

+0

@华富它应该在Ember中工作1.我不确定关于余烬2.我没有在余烬上工作过一段时间。但我认为它不会,因为控制器正在被替换成支持可编程逻辑器件2中的可路由组件。我甚至不知道他们已经朝那个方向移动。但如果你找到替代方案,你可以在这里更新。 – blessenm

+0

不,我的意思是,'controllerFor'是'Ember.Route'的一个公共方法,在Ember 2中它也是'Ember'的一个私有静态方法,但我不认为它是一个'Ember.Component ',甚至是私人的。换句话说,这可以通过路由而不是来自组件,因为在那里不能访问'controllerFor'。 – Huafu

1

试试这个。

export default Ember.Route.extend({ 
 
    routeName: null, 
 
    
 
    beforeModel(transition){ 
 
    //alert(JSON.stringify(transition.targetName) + 'typeof' + typeof transition.targetName); 
 
    this.set('routeName', transition.targetName); 
 
    }, 
 
    model(){ 
 

 
    // write your logic here to determine which one to set 'active' or pass the routeName to controller or component 
 
    }

`

1

其实,你并不需要自己申请活动类。 A link-to帮手会为你做。

here

{{link-to}}将应用的CSS类名“主动”当应用程序的当前路由提供的routeName匹配。例如,如果应用程序的当前路线是“photoGallery.recent”以下使用的{{link-to}}

{{#link-to 'photoGallery.recent'}} 
    Great Hamster Photos 
{{/link-to}} 

将导致

<a href="/hamster-photos/this-week" class="active"> 
    Great Hamster Photos 
</a> 
+0

'link-to'的一个很好的用法! –

0

使用来自@ maharaja-santhir的答案的见解,可以考虑设置目标控制器上的routeName属性,例如在目标的模板中使用。这样就不需要在多个位置定义逻辑,从而实现代码重用。下面是如何完成这样的例子:定义应用程序中的路线这willTransition行动

// app/routes/application.js 
export default Ember.Route.extend({ 
    ... 

    actions: { 
     willTransition(transition) { 
      let targetController = this.controllerFor(transition.targetName); 
      set(targetController, 'currentRouteName', transition.targetName); 
      return true; 
     } 
    } 
}); 

允许传播当前路径名到应用程序的任何地方。请注意,目标控制器即使在导航到其他路线后也会保留currentRouteName属性设置。如果需要,这需要手动清理,但根据您的实施和使用情况,这可能是可以接受的。

相关问题