根据当前的路由名称,我需要将“活动”类应用于引导选项卡。路由对象包含“routeName”,但是如何从控制器或组件访问此路由对象?访问控制器或组件的当前路由名称
回答
为灰烬2,从控制器,你可以试试:
appController: Ember.inject.controller('application'),
currentRouteName: Ember.computed.reads('appController.currentRouteName')
然后您可以将它传递给组件。
在绝对绝望的情况下,您可以通过组件内的this.container.lookup("router:main")
或this.container.lookup("controller:application")
来查找路由器或应用程序控制器(它暴露'currentRouteName'属性)。
如果这对我来说是一个普遍的趋势,我会做一个CurrentRouteService并将它注入到我的组件中,这样我就可以在测试中更容易地嘲笑事物。
可能还有更好的答案 - 但container.lookup()应该打倒你目前的阻止者。
它为我返回undefined:'this.container.lookup(“router:main”)。get('currentRouteName')' – jax
使用这个this.controllerFor('application').get('currentRouteName');
这是否从组件工作? – Huafu
@华富它应该在Ember中工作1.我不确定关于余烬2.我没有在余烬上工作过一段时间。但我认为它不会,因为控制器正在被替换成支持可编程逻辑器件2中的可路由组件。我甚至不知道他们已经朝那个方向移动。但如果你找到替代方案,你可以在这里更新。 – blessenm
不,我的意思是,'controllerFor'是'Ember.Route'的一个公共方法,在Ember 2中它也是'Ember'的一个私有静态方法,但我不认为它是一个'Ember.Component ',甚至是私人的。换句话说,这可以通过路由而不是来自组件,因为在那里不能访问'controllerFor'。 – Huafu
试试这个。
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
}
`
其实,你并不需要自己申请活动类。 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>
'link-to'的一个很好的用法! –
使用来自@ 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
属性设置。如果需要,这需要手动清理,但根据您的实施和使用情况,这可能是可以接受的。
- 1. Base_Controller:在Laravel中访问当前的控制器名称
- 2. 路由:控制器资源之前的前缀项名称
- 3. 是否有可能访问当前的路由组件与阵营路由器
- 4. 如何获取路线“名称”当路由控制器
- 5. Emberjs - 如何访问RC1中的当前状态或路由名称?
- 6. Ember.js:访问父路由的控制器
- 7. 从路由的beforeModel访问控制器
- 8. 在Slim3控制器的类构造函数中访问当前的路由名称
- 9. 基本MVC路由:/文件夹名称/文件夹名称/控制器名称
- 10. 没有控制器或操作名称的Asp.net mvc路由
- 11. Symfony2路由访问控制
- 12. 前缀控制器的插件路由
- 13. 路由前缀VS控制器名称(Web api)
- 14. 获取当前路由名称到组件
- 15. 访问组件内的当前Ember路由
- 16. 路由器可以添加控制器名称吗?与URL和控制器的名称冲突问题
- 17. Ember.js使用新路由器访问和组织控制器
- 18. 如何获取当前路由名称?
- 19. Rails 3名称空间模型和控制器路由问题
- 20. 从子控制器访问路由提供者控制器
- 21. 如何在使用流星路由器时访问流星中当前路由的名称?
- 22. React路由器获取组件外的当前路由
- 23. 路由错误:当分割控制器路由到名称空间路由时未初始化的常量
- 24. 访问当前路由参数laravel4
- 25. Laravel 4如何使用路由名称别名(使用)与路由::控制器
- 26. 加前缀的路由控制器
- 27. 路线::控制器路线名称
- 28. Angular 2,如何显示当前路由名称? (路由器3.0.0-beta.1)
- 29. phalconphp触发事件的访问控制器名称
- 30. 路由相同的名称控制器和不同的区域
可能this.controllerFor('application')。get('currentRouteName') – blessenm
@blessenm是的,这几乎是我想要的 – jax
烬将为你做这个。只需在您的标签上使用link-to – killebytes