我的任务是为Ember 2应用程序开发一个菜单组件.这将是一个复杂的组件,其视觉表示随着用户经过路线而改变.例如,它应该在"/ index"路由时禁用特定菜单及其所有项目,但在"/ details"等时启用它及其一些项目.
所以,我有一个传递单例模型的组件(当前存储在服务中,顺便说一下,它是在Ember中存储全局可用的单例模型的正确位置吗?).它可以很好地显示内容,但它不会尊重当前路线,也不会在用户浏览应用程序时捕获路径更改.我怎样才能实现它?
总结一下:
组件需要以某种方式获得当前路由以能够显示其初始状态,例如用户将"/ details"页面加入书签并访问它.
该组件必须以某种方式处理路由更改.
服务是保存单例模型(可能从服务器获取)的好地方.
您能否就如何解决上述三项问题提出自己的想法?
解决:好的,这是如何完成的,感谢@ Bek的建议:
import Ember from "ember"; export default Ember.Component.extend({ router: Ember.inject.service("-routing"), didInsertElement: function() { let r = this.get("router"); console.log("Initial route", r.get("currentRouteName")); r.addObserver("currentRouteName", this, "currentRouteNameChanged"); }, "currentRouteNameChanged": function(router, propertyName) { console.log(router.get("currentRouteName")); } });
更多问题:) - 我不得不currentRouteNameChanged
用引号括起函数名称(使其成为一个字符串),否则它不会被调用.我想我错过了一些非常基本和明显的东西吗?
还有一个问题是时髦的服务名称-routing
- @Bek,我可以自己弄清楚的任何提示,是否有可以注册信息的可注入内容列表?它还没有在Ember文档中我假设但是它的源代码在哪里检查出来?如何稳定的-routing
名称,它会成为*routing
最终版本的东西吗?
回答1和2:在最新版本的ember 2.x(至少2.2中)router
可用作服务,因此您可以将其注入组件router: Ember.inject.service('-routing')
并观察更改currentRouteName
,但它目前是私有服务,因此应谨慎使用,因为它可能会改变(可能会重命名routing
),还有rfc https://github.com/emberjs/rfcs/pull/38,它提出了可路由的组件,这些组件将来会成为ember的一部分.
Anser to 3:服务通常是无状态的,但是可以存在共享全局逻辑/对象的异常和服务,所以这不是一个坏主意