到目前为止,我通常有一个数据源类,其中包含访问服务器,检索数据并将其作为控制器的所有功能,类似于:
...
App.DataSource = Ember.Object.extend({
getBooks: function(callback) {
$.ajax({
url: '/books.json',
done: function(data){
//process the data
App.get('router.booksController').set('content', processedData);
}
});
}
});
App.dataSource = App.DataSource.create();
...
但是自4版之前版本发布以来,无法再从路由器访问控制器,看起来对它们的访问受到很大限制,如this问题中所述。
所以根据这些变化,这是不可能的?推荐的方式是什么?
答案 0 :(得分:1)
路由器有一个新方法controllerFor,它获取控制器实例的字符串名称。只要您可以获得对路由器的引用,您就应该能够访问由ember实例化/生成的控制器。
请参阅:http://emberjs.com/guides/routing/setting-up-a-controller/
您可能仍然可以执行类似App.Router.controllerFor("books")
的操作,尽管在您的对象中执行类似模型的硬编码不会很好。
我注意到的另一个奇怪的事情是,Ember.Router不再在网站API中查找文档。我认为这是因为他们将路由器的核心移动到一个独立的项目,Ember延伸或类似的东西。
我认为这是github来源:https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/system/route.js
答案 1 :(得分:1)
我个人会说你在这个意义上错误地使用了Ember。让App.DataSource
对象知道控制器对我来说似乎很奇怪。要问自己两个重要问题:
@Matt:我也一直在使用this.controllerFor
方法,但此后已被弃用。相反,我们应该使用needs
方法:
App.IndexController = Ember.Controller.extend({
// Requires App.ThisController, App.ThatController.
needs: ['this', 'that']
});
在这种情况下,我会让BooksController
负责填充自己。也许在init
方法中。
如果你真的需要使用App.DataSource
,那么你真的需要考虑另一种方法来做到这一点。