1

在我的 ember 应用程序中,我希望在不同的命名空间上有模块。我有一个应用程序命名空间,每个模块都有一个App.ModuleName命名空间。

到目前为止一切顺利,我可以使用App/ModuleName/SomeResource语法访问到目前为止的所有内容。现在我有一个控制器,它依赖于模块命名空间之一中的控制器。我这样设置控制器:

App.ModuleName.FooController = Ember.Controller.extend({
    fooVal: 42
});

App.SomeController = Ember.Controller.extend({
    needs: ['App/ModuleName/Foo', 'bar']
});

到目前为止,这似乎有效,因为 ember 并没有抱怨所需的控制器不存在。

现在,如何在我的车把模板中访问控制器?对于bar控制器来说,它很简单,只需使用,controllers.bar.someProperty但我无法访问App.ModuleName.FooController. 我试过了:

{{controllers.App/ModuleName/Foo.fooVal}}
{{controllers.App.ModuleName.Foo.fooVal}}
{{controllers.Foo.fooVal}}

等等,我能想到的每一种组合,但它没有奏效。是否有可能(以及如何)让它运行?有人可以启发我吗?

顺便说一句:即使在我needs成功使用的控制器上,如果我调试它们(将它们登录到控制台,直接从我的代码或使用车把助手),controllers属性总是undefined. 有没有办法检查所需的控制器引用?

提前谢谢了。

4

2 回答 2

2

据我所知,Ember 的容器通过解析器查找内容。它只在应用程序的命名空间中查找内容。

DefaultResolver文档中的一些示例。

'controller:post' //=> App.PostController
'controller:posts.index' //=> App.PostsIndexController
'controller:blog/post' //=> Blog.PostController
'controller:basic' //=> Ember.Controller

为了实现您所需要的,您需要提供一个自定义Resolver,以便在创建应用程序时在不同的命名空间中查找内容。

App = Ember.Application.create({
  resolver: MyNewResolver
});
于 2013-07-11T03:24:50.987 回答
0

对于所有对我如何解决问题以及我尝试和学到的东西感兴趣的人:

我在代码中做了一些挖掘并尝试了一些东西。我得到了想要的输出

a) 一个自定义的 Handlebars 助手,它返回控制器的属性,如下所示:

{{ myhelper 'App.ModuleName.FooController' 'fooVal'}}

使用以下(快速而肮脏的)助手:

Ember.Handlebars.registerBoundHelper('myhelper', function(arg1, arg2, opts) {

    if (opts && opts['data']) {
        var ctrl = opts.data.properties[0];
        var prop = opts.data.properties[1];

        var controller = this.get('container').lookup('controller:' + ctrl.split('.').join('/'));
        if (controller) {
            return controller.get(prop);
        }
    }
});

问题是,我无法让数据绑定工作,所以如果我更改了我的底层模型,视图不会更新。

b) 重写 Controllersinit()方法以获取控制器实例,如下所示:

init: function() {
   this.module = this.get('container').lookup('controller:App/Module/Foo');
}

然后在模板中:

{{module.fooVal}}

在第二种方式中,数据绑定也有效,但感觉不正确,所以我做了一些谷歌搜索,在 emberjs 问题列表中看到了这篇文章:

https://github.com/emberjs/ember.js/issues/683#issuecomment-5122333

正如 tomdale 所说,ember 中并不鼓励嵌套命名空间,但多个“顶级”命名空间是可以的。所以我决定为每个模块建立一个顶级命名空间,并使用自定义解析器来解析它们。现在像魅力一样工作,感觉是正确的方法。

对于我解决问题的第二种也是最后一种方法的优缺点的任何其他建议和评论将不胜感激。

于 2013-07-17T18:44:48.733 回答