在EmberJS中进行异步操作时无法设置控制器的内容

时间:2014-09-02 16:17:27

标签: ember.js

当我想在特定操作后更新我的控制器内容时,我会陷入困境:

this.set('content',CL.myModel.findALL());

我没有使用余烬数据或其中任何一个。

CL.myModel.findALL返回一个Ember promise,它会在回调中返回结果。

实际上,我在路由器的setupController中做了同样的事情并且效果很好。 为什么它在控制器本身不起作用?

感谢您的帮助。

2 个答案:

答案 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);      
})