1

我最近不得不将我所有的路线转换为深度嵌套的版本。例如: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']

4

2 回答 2

1

this.get('controllers.booksBook')将工作。

因为 Ember 在不同的地方使用了一些不同的命名约定,所以每当一个对象注册到应用程序容器时,它的名称就会被规范化。这确保了不同的查找格式总是以相同的方式解析。因此,您可以使用不同的查找格式来明确引用属性路径中的控制器。

规范化将点路径和下划线字符串转换为骆驼化。保留正斜杠。您可以查看测试以packages/ember-application/tests/system/dependency_injection/normalization_test.js了解更多详细信息。

于 2013-09-01T04:24:32.717 回答
0

您是否尝试过简单地使用 PagesController 来访问this.get('controllers.pages');?我相信您不必指定整个路径。

这是一个对我有用的简短示例:

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()
});
于 2013-08-31T22:10:28.723 回答