我的任务是为Ember 2应用程序开发一个菜单组件。这将是一个复杂的组件,其视觉表示随着用户经过路线而改变。例如,它应该在" / index"上禁用特定菜单及其所有项目。路线,但启用它和它的一些项目时," / details"等等。
所以,我有一个传递单件模型的组件(当前存储在服务中,顺便说一下,它是在Ember中存储全局可用的单例模型的正确位置吗?)。它可以很好地显示这些东西但它不会尊重当前路线,也不会在用户通过应用程序时捕获路线更改。我怎样才能实现它?
总结:
您能否就如何解决上述三项问题提出想法?
已解答:好的,这里是如何完成的,感谢@ 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
还是什么?
答案 0 :(得分:6)
回答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: 服务通常是无状态的,但是可以存在共享全局逻辑/对象的异常和服务,因此这不是一个坏主意