模型连接到控制器的哪一点?并且,当模型出现时是否有钩子?
因为我面临以下问题:无法访问模型以对其中的数据进行一些计算:
App.ResultsRoute = Ember.Route.extend({
model: function(){
// LOCAL, blocking call!
return {messages : this.store.all('message').toArray()};
}
});
App.ResultsController = Ember.ObjectController.extend({
init : function(){
this._super();
console.log(this);
console.log(this.get('model'));
console.log(this.get('model.messages'));
this._someComputation();
},
_someComputation : function(){
this.get('model.messages').forEach(function(message){
//do something
}
}
});
打印:
Class { [...] model: messages: Array[58]0: Class1: Class2: [...] Class57: Class length: 58}
null
null
所以,基本上我可以在控制台中看到模型,但是当在init
函数中以编程方式访问它时,它还没有(还有?)。
或者这是用模型数据进行一些计算的错误方式(或地点)?
修改
子路由的控制器可以访问模型,因此这可以作为一种解决方法:
App.ResultsIndexController = Ember.Controller.extend({
needs: "results",
parentController : Ember.computed.alias('controllers.results'),
init : function(){
console.log("ResultsIndexController created");
console.log(this.get('parentController').get('model'));
}
});
打印:
ResultsIndexController created
{messages: Array[55]}
但我宁愿在父控制器中使用它,以便所有孩子都可以访问它。
答案 0 :(得分:1)
它在setupController
期间附加在路由中,在初始化之后,当模型已经解决时。代码基本上如下所示:
App.ResultsRoute = Ember.Route.extend({
model: function(){
// LOCAL, blocking call!
return {messages : this.store.all('message').toArray()};
},
setupController: function(controller, model){
controller.set('model', model);
}
});
如果您希望在setupController
期间执行此操作,则覆盖它以添加其他功能是一种相当普遍的做法。
App.ResultsRoute = Ember.Route.extend({
model: function(){
// LOCAL, blocking call!
return {messages : this.store.all('message').toArray()};
},
setupController: function(controller, model){
this._super(controller, model);
controller._someComputation();
}
});
此外,你的模型钩子说它是一个阻塞的电话,但是你没有回复一个承诺,所以这不是真的(但也许这只是一个复制粘贴foo)< / p>