ember.js - Ember-Data save() 从未触发成功回调

标签 ember.js ember-data

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

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

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

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

我的 Controller 中有一个简单的注册函数:

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

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

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

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

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

迈克

解决方案

所以,问题与 JSON 响应有关。两个问题:

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

以下是有效的回复:

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

最佳答案

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

返回的模型应采用以下格式

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

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

关于ember.js - Ember-Data save() 从未触发成功回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21446352/

相关文章:

ember.js - EmberJS - 每当路由更改时调用函数

javascript - 我想检查 Ember.js 中的所有表行

javascript - ember.js,在 Controller 中过滤 PromiseManyArray

ember.js - 模型 promise 导致模板使用 .content

ember.js - 推荐使用最新版本的基本 ember.js 示例?

javascript - Ember.js 处理子枚举的单个成员

javascript - Ember.js 和 connectOutlet 模板上下文问题

ember.js - Ember -- TypeError : arrangedContent. addArrayObserver 不是函数

ember.js - 通过 sortProperty mixin 对 Ember-Data 支持的 ArrayController 进行排序

ember.js - 强制 ember data store.find 从服务器加载