当我想在特定操作后更新我的控制器内容时,我会陷入困境:
this.set('content',CL.myModel.findALL());
我没有使用余烬数据或其中任何一个。
CL.myModel.findALL返回一个Ember promise,它会在回调中返回结果。
实际上,我在路由器的setupController中做了同样的事情并且效果很好。 为什么它在控制器本身不起作用?
感谢您的帮助。
答案 0 :(得分:1)
你应该这样做:
controller = this;
CL.myModle.findALL().then(function(models) {
controller.set('content', models);
})
我相信它在Route#setupController
中没有这个的原因是因为,在幕后,Ember做了类似于上面代码的事情,结果是你的model
钩子(这通常是一个承诺) )。
你可以看到的另一个选择是DS.PromiseObject(它是一个很好的抽象,用于承诺承诺并将其履行价值公开为content
。你是' d必须从ember-data构建中提取它。
答案 1 :(得分:0)
以下是我的模型示例:
CL.myModle.reopenClass({
findAll : function(){
return CL.Utils.ajaxPromise(r)
.then(this.findByIdSuccess.bind(this), this.findByIdFailed.bind(this));
},
findByIdSuccess: function (data) {
var negotiation = CL.NegotiationModel.create(data);
this.setMembers(negotiation);
this.setParties(negotiation);
this.setVersions(negotiation);
return negotiation;
},
})
这是我的控制器:
onRefresh : function(){
this.set('content',CL.myModle.findAll())
}
正如您在模型部分中看到的,我调用了一些进行模型修改的函数,并将其返回到findByIdSuccess回调中。
我不能只是在承诺的“当时”中返回我检索的数据。
我的问题是否仍然不清楚:有没有办法在不做的情况下获得承诺的数据:
CL.myModle.findALL().then(function(models) {
controller.set('content', models);
})