我最近不得不将所有路由转换为深层嵌套版本。例如:pages.page
成为books.book.pages.page
。我正在做的一些连接是必要的。问题是我有一个控制器声明它需要另一个控制器。具体来说,它需要book
控制器。但现在book
控制器是books.book
控制器。这提出了一个问题,因为此代码不再有效:
this.get('controllers.books.book');
现在它认为book
只是books
控制器的一个属性,而实际上它只是一个属性。我该如何解决这个问题?到目前为止,我已经尝试过这些方法,其中没有一个可行:
this.get('controllers').get('books.book');
this.get('controllers.`books.book`');
this.get("controllers.'books.book'");
编辑:我还应该指出,调用this.get('controllers').needs
会给我一个数组:['application', 'books.book']
。
答案 0 :(得分:1)
this.get('controllers.booksBook')
将有效。
因为Ember在不同的地方使用了一些不同的命名约定,所以每当向应用程序容器注册一个对象时,它的名称就会被标准化。这可确保不同的查找格式始终以相同的方式解析。因此,您可以使用不同的查找格式来明确地引用属性路径中的控制器。
规范化将虚线路径和下划线字符串转换为camelized。正斜杠被保留。您可以查看packages/ember-application/tests/system/dependency_injection/normalization_test.js
中的测试以获取更多详细信息。
答案 1 :(得分:0)
您是否只是使用this.get('controllers.pages');
尝试访问PagesController?我相信你不必指定整条路径。
这是一个对我有用的简短例子:
App.Router.map(function() {
this.resource('books', function() {
this.resource('book', function() {
this.resource('pages', function() {
this.route('page', function() {
});
});
});
});
});
App.PagesController = Ember.ObjectController.extend({
});
App.BookController = Ember.ObjectController.extend({
needs: "pages",
pages: function() {
return 'My PagesController, ' + this.get('controllers.pages')
}.property()
});