【问题标题】:Can't set controller's content when async action in EmberJSEmberJS 中的异步操作时无法设置控制器的内容
【发布时间】:2014-09-02 16:17:26
【问题描述】:

当我想在特定操作后更新控制器的内容时​​遇到了困难:

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

我没有使用 ember-data 或其中任何一个。

CL.myModel.findALL 返回一个 Ember 承诺,在其回调中返回结果。

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

感谢您的帮助。

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    你应该这样做:

    controller = this;
    
    CL.myModle.findALL().then(function(models) {
      controller.set('content', models);      
    })
    

    我相信它在 Route#setupController 中没有这个就可以工作的原因是,在幕后,Ember 用你的 model 钩子(通常是一个承诺)的结果做了类似于上面代码的事情。

    您可以查看的另一个选项是 DS.PromiseObject(它是包装承诺并将其履行值公开为 content 的承诺的一个很好的抽象。不过,您必须从 ember-data 构建中提取它。

    【讨论】:

    • 感谢您的快速回答,我也考虑过这个解决方案,但是在我的 CL.myModle.findALL() 承诺的解析器中,我需要处理数据,我无法立即显示来自网络服务。有没有办法通过得到一个promise来设置内容?
    • 很抱歉 - 我对您的评论感到有些困惑。您的问题提到 CL.myModle.findALL() 返回一个承诺,所以我的答案中的代码是在承诺解决后设置控制器的内容(意味着数据可用)。
    【解决方案2】:

    这是我的模型的一个例子:

    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 回调。

    我不能只返回我在 promise 的“then”中检索到的数据。

    如果仍然不清楚,我再次提出问题:有没有什么方法可以在不做的情况下获得承诺的数据:

    CL.myModle.findALL().then(function(models) {
       controller.set('content', models);      
    })
    

    【讨论】:

      猜你喜欢
      • 2013-10-05
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      相关资源
      最近更新 更多