EmberJS 2

时间:2015-12-24 12:11:45

标签: ember.js

我的任务是为Ember 2应用程序开发一个菜单组件。这将是一个复杂的组件,其视觉表示随着用户经过路线而改变。例如,它应该在" / index"上禁用特定菜单及其所有项目。路线,但启用它和它的一些项目时," / details"等等。

所以,我有一个传递单件模型的组件(当前存储在服务中,顺便说一下,它是在Ember中存储全局可用的单例模型的正确位置吗?)。它可以很好地显示这些东西但它不会尊重当前路线,也不会在用户通过应用程序时捕获路线更改。我怎样才能实现它?

总结:

  1. 组件需要以某种方式获得当前路由以能够显示其初始状态,例如用户为" / details"页面并访问了它。
  2. 组件必须以某种方式处理路由更改。
  3. 服务是保存单例模型的好地方(可能从服务器获取)。
  4. 您能否就如何解决上述三项问题提出想法?

    已解答:好的,这里是如何完成的,感谢@ 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 个答案:

答案 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: 服务通常是无状态的,但是可以存在共享全局逻辑/对象的异常和服务,因此这不是一个坏主意