我的任务是为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文档中我假设但是在它的源代码中检查出来了吗?一般来说,如果名称稳定,它会成为*路由或最终版本中的某些东西吗?
解决方法
回答1和2:
在最新版本的ember 2.x(至少2.2版本)中,路由器可用作服务,因此您可以将其注入组件路由器:Ember.inject.service(‘ – routing’)并观察对currentRouteName的更改,但它目前是私有的因此服务应该谨慎使用,因为它可能会改变(可能会重命名为路由),还有rfc https://github.com/emberjs/rfcs/pull/38提出了可路由的组件,这些组件将来会成为ember的一部分.
在最新版本的ember 2.x(至少2.2版本)中,路由器可用作服务,因此您可以将其注入组件路由器:Ember.inject.service(‘ – routing’)并观察对currentRouteName的更改,但它目前是私有的因此服务应该谨慎使用,因为它可能会改变(可能会重命名为路由),还有rfc https://github.com/emberjs/rfcs/pull/38提出了可路由的组件,这些组件将来会成为ember的一部分.
Anser到3:服务通常是无状态的,但是可以存在共享全局逻辑/对象的异常和服务,因此这不是一个坏主意