【问题标题】:Success callback never triggered with Ember-Data save()Ember-Data save() 从未触发成功回调
【发布时间】:2014-02-22 03:46:43
【问题描述】:

我正在尝试使用 ember-data 获取一个简单的注册表单以保存在我的服务器上。该调用在技术上有效,但成功回调永远不会在 promise 上触发,我不知道为什么。

服务器从前端接收到数据并成功保存到数据库中。然后它返回状态码 201 表示已创建。我可以在 Chrome 调试器中看到成功的响应。但是即使服务器以成功状态响应,错误回调也会在保存的承诺上触发。我已经通过放置调试器确认每次都会发生这种情况;错误回调中的语句。

我的路由器型号是这样连接的:

model: function() {
  return this.store.createRecord('registerUser');
}

我的控制器中有一个简单的注册功能:

register: function() {
  var self = this;
  this.get('model').save().then(function() {
     self.transitionToRoute('index');
  }, function(resp) {
     if (resp.responseJSON) {
       self.get('model').set('errors', resp.responseJSON.errors);
     } 
  });
}

每次我的服务器返回响应(成功或失败)时,都会触发失败回调。如果我在响应中有错误(对于无效数据或其他内容),错误会成功显示在表单中。我可以看到请求正确进入,并且数据存储在数据库中。因此,从技术上讲,保存是成功的,但是即使从服务器返回成功的 201 状态(可以在 Chrome 调试器中验证),ember 似乎也不知道它是成功的。

我唯一能想到的是 ember-data 的适配器正在做一些我不知道的事情,但我只是使用默认的 RESTAdapter 并没有触及它。还有什么吗

如果有所不同,则服务器正在运行 Play 1.2.5。我不知道这是否会对响应的标题或类似内容产生影响。

任何帮助将不胜感激。感谢您的宝贵时间!

迈克

解决方案

因此,问题与 JSON 响应有关。两个问题:

  • 我没有在回复中包含 ID
  • 我没有将响应“包装”在“registerUser”中。这是匹配模型名称所必需的。

以下是有效回复:

{
  "registerUser": {
    "id": 11,
    "email": "mike999@test.com",
    "password": "12345",
    "password2": "12345",
    "name": "Mike"
  }
}

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    Ember Data 期待响应中的模型,因此发回成功的 http 状态并不意味着它会到达成功端点。当它尝试序列化您的响应(或缺少响应)时,它可能会失败,这就是它遇到失败功能的原因。响应的一个重要原因是记录的id

    返回的模型应为以下格式

    {
       registerUser:{
         id: "123",
         attr: "asdf"
       }
    }
    

    https://github.com/emberjs/data/blob/master/TRANSITION.md

    【讨论】:

    • 确认!看起来很简单。事实上,我正在返回一个 json 响应,但不包括 id 并且它没有包含在“registerUser”中。这现在就像一个魅力!非常感谢!
    • 我的服务器也不会扭曲返回的 json,在这种情况下我该如何设置 ember?
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 2018-12-23
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多