我可以想到4个选项:
1)在路由器中:
connectOutlets: function(router) {
router.get('applicationController').connectOutlet(outlet, controller/view, router.get('store').findAll(Model);
}
每次调用connectOutlet
时都会调用findAll
2)在控制器的init中:
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方式”是什么?
答案 0 :(得分:2)
我非常有信心说选项1是Ember方式。
connectOutlets: function(router) {
router.get('applicationController').connectOutlet(outlet, Model.find());
}
2&的问题3默认情况下您不希望在控制器初始化时加载数据,因为这会使数据的延迟加载/分页变得困难。
听起来你的主要问题是每次进入路线时调用findAll
。
但是,如果您使用的是DS.RESTAdapter
或类似的,那么这是一个非问题,因为身份映射将捕获第二个呼叫,因此只会在第一次查询服务器。