2013-08-31 48 views
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']

回答

1

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

因为Ember在各个地方使用了一些不同的命名约定,所以无论何时向应用程序容器注册一个对象时,它的名称都会被标准化。这确保了不同的查找格式总是以相同的方式解决。因此,您可以使用不同的查找格式明确地在属性路径中引用控制器。

规范化将虚线路径和下划线字符串转换为camelized。正斜线被保留。您可以参阅packages/ember-application/tests/system/dependency_injection/normalization_test.js中的测试以获取更多详细信息。

+0

这实际上似乎没有工作。使用'controllerFor'可以返回正确的控制器,但是使用该代码只会返回undefined。另外,我在第一篇文章中加入了一些信息来澄清一些事情。 – GJK

+0

划痕,这实际上确实工作。我只需要声明控制器需要'bookBook'而不是'books.book'。谢谢! – GJK

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() 
}); 
+0

就你而言,'pages'是路由的真实名称。在你的代码中,不是'book',而是使用'books.book',然后使用'books.book.pages'等。(如下所示:http://emberjs.com/guides/routing/defining-your-路线/)你会发现你的代码不起作用。 – GJK

+0

也许我误解了你告诉我的内容,但是如果你有深度嵌套的名为BooksBookPagesPageController的控制器。这似乎令人费解。所以这可能是一个更清洁的方法。 – kroofy

+0

相信我,这是一个更清洁的方法。但是我在链接时遇到了问题。具体来说,我有一些角落案例,我无法链接到更深的路线,因为我无法提供所有需要的模型。这种方式更加冗长,但更明确,更容易一些。 – GJK