如何在Ember.pre4版本中从普通类访问控制器?

时间:2013-02-08 23:36:40

标签: javascript ember.js ember-router

到目前为止,我通常有一个数据源类,其中包含访问服务器,检索数据并将其作为控制器的所有功能,类似于:

...
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问题中所述。

所以根据这些变化,这是不可能的?推荐的方式是什么?

2 个答案:

答案 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对象知道控制器对我来说似乎很奇怪。要问自己两个重要问题:

  1. 为什么这个对象有责任填充控制器?
  2. 为什么控制器不负责填充自己?
  3. @Matt:我也一直在使用this.controllerFor方法,但此后已被弃用。相反,我们应该使用needs方法:

    App.IndexController = Ember.Controller.extend({
        // Requires App.ThisController, App.ThatController.
        needs: ['this', 'that']
    });
    

    在这种情况下,我会让BooksController负责填充自己。也许在init方法中。

    如果你真的需要使用App.DataSource,那么你真的需要考虑另一种方法来做到这一点。