Ember.js Emberjs:访问控制器对不同命名空间的依赖关系

Ember.js Emberjs:访问控制器对不同命名空间的依赖关系,ember.js,handlebars.js,Ember.js,Handlebars.js,在我的ember应用程序中,我希望在不同的名称空间上有模块。我有一个应用程序名称空间,每个模块都有一个App.ModuleName名称空间 到目前为止很好,我可以使用App/ModuleName/SomeResource语法访问到目前为止的所有内容。现在我有一个控制器,它依赖于一个模块名称空间中的控制器。我设置了如下控制器: App.ModuleName.FooController = Ember.Controller.extend({ fooVal: 42 }); App.SomeC

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

到目前为止很好,我可以使用
App/ModuleName/SomeResource
语法访问到目前为止的所有内容。现在我有一个控制器,它依赖于一个模块名称空间中的控制器。我设置了如下控制器:

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

App.SomeController = Ember.Controller.extend({
    needs: ['App/ModuleName/Foo', 'bar']
});
init: function() {
   this.module = this.get('container').lookup('controller:App/Module/Foo');
}
到目前为止,这似乎是有效的,ember没有抱怨所需的控制器不存在

现在,如何在我的把手模板中访问控制器?对于
bar
控制器,只需使用
controllers.bar.someProperty
即可,但我无法访问
App.ModuleName.FooController
。我试过:

{{controllers.App/ModuleName/Foo.fooVal}}
{{controllers.App.ModuleName.Foo.fooVal}}
{{controllers.Foo.fooVal}}
诸如此类,我能想到的每一个组合,但都不起作用。是否有可能(以及如何)运行此功能?有人能告诉我吗

顺便说一句:即使在我成功使用的
需要的
控制器上,如果我调试它们(直接从代码或使用把手助手将它们登录到控制台),那么
控制器
属性始终是
未定义的
。有没有办法检查所需的控制器引用


非常感谢。

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

DefaultResolver中的一些示例

为了实现您所需要的功能,您需要提供一个自定义的
解析器
,在创建应用程序时在不同的名称空间中查找内容

App = Ember.Application.create({
  resolver: MyNewResolver
});

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

我在代码中做了一些挖掘,并尝试了一些事情。我使用

a) 返回控制器属性的自定义Handlebars辅助对象,如下所示:

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

App.SomeController = Ember.Controller.extend({
    needs: ['App/ModuleName/Foo', 'bar']
});
init: function() {
   this.module = this.get('container').lookup('controller:App/Module/Foo');
}
{{myhelper'App.ModuleName.FooController''fooVal'}

使用以下(快速和肮脏)帮助程序:

问题是,我无法使数据绑定工作,因此如果我更改了基础模型,视图就不会更新

b) 重写Controllers
init()
方法以获得如下控制器实例:

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

App.SomeController = Ember.Controller.extend({
    needs: ['App/ModuleName/Foo', 'bar']
});
init: function() {
   this.module = this.get('container').lookup('controller:App/Module/Foo');
}
然后在模板中:

{{module.fooVal}}

在第二种方式中,数据绑定也起了作用,但感觉不正确,所以我做了一些googlin,在emberjs问题列表上看到了这篇文章:

正如tomdale所说,ember中并不鼓励使用嵌套的名称空间,但是可以使用多个“顶级”名称空间。所以我决定为每个模块设置一个顶级名称空间,并使用自定义解析器来解析它们。它现在很有魅力,而且感觉是正确的方式


如果您对我的第二个也是最后一个解决问题的方法的利弊有任何其他建议和意见,我们将不胜感激。

谢谢您的回答。
DefaultResolver
App/ModuleName/Foo
解析为
App.ModuleName.FooController
,这是正确的,因此这似乎不是问题所在。问题是我无法在我的把手模板中找到访问它的名称。有什么想法吗?很有趣。我的印象是命名规则相当严格。Post(模型)->PostRoute->PostController->PostView->Post或Post/索引(隐式时)。尝试打开日志视图查找。它将打印出渲染视图时Ember正在查找的模板。