0

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

...
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();
...

但是由于发布了 pre-4 版本,因此无法再从路由器访问控制器,并且似乎对它们的访问非常有限,如问题所述。

那么根据这些变化,这不可能了?推荐的方法是什么?

4

2 回答 2

1

就我个人而言,我会说你在这个意义上错误地使用了 Ember。App.DataSource让您的对象知道控制器对我来说似乎很奇怪。两个重要的问题要问自己:

  1. 为什么这个对象有责任填充控制器?
  2. 为什么控制器没有填充自己的责任?

@Matt:我也一直在使用该this.controllerFor方法,但此后已被弃用。相反,我们应该使用以下needs方法:

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

在这种情况下,我将BooksController负责填充自身。也许在init方法上。

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

于 2013-02-09T00:59:11.933 回答
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

于 2013-02-09T00:33:13.013 回答