2

我可以想到4个选项:

1)在路由器中:

connectOutlets: function(router) {
    router.get('applicationController').connectOutlet(outlet, controller/view, router.get('store').findAll(Model);
}

这将在每次调用时调用connectOutletfindAll

2)在控制器的初始化中:

App.MyController = Ember.ArrayController.extend({
    init: function() {
        this._super();
        this.set('content', App.router.get('store').findAll(Model));
    }
});

这将仅在第一次实例化控制器时调用 findAll。

3)直接分配给控制器的内容:

App.MyController = Ember.ArrayController.extend({
    content: App.router.get('store').findall(Model)
});

这也只会在第一次实例化控制器时调用 findAll ,但是如果我这样做,我会收到一个错误 -Uncaught TypeError: Cannot call method 'get' of undefined所以路由器可能还没有被实例化。

4) 从路由器调用控制器的函数来分配数据:

connectOutlets: function(router) {
    router.get('applicationController').connectOutlet(outlet, controller/view, router.get('store').findAll(Model);
    router.get('myController').getData();
}

App.MyController = Ember.ArrayController.extend({
    getData: function() {
        this.set('content', App.router.get('store').findAll(Model));
    }
});

与第一个选项相同的评论。

我的问题是,在控制器中分配数据的首选方式或“Ember 方式”是什么?

4

1 回答 1

2

我很有信心说选项 1 是 Ember 方式。

connectOutlets: function(router) {
  router.get('applicationController').connectOutlet(outlet, Model.find());
}

2 和 3 的问题是,您不希望在默认情况下在控制器初始化时加载数据,因为这会使数据的延迟加载/分页变得困难。

听起来您的主要问题是findAll每次进入路线时的呼叫。但是,如果您使用的是DS.RESTAdapter或类似的,这不是问题,因为身份映射将捕获第二次调用,因此服务器只会在第一次被查询。

于 2012-12-26T11:43:45.047 回答