从未使用Ember-Data save()触发成功回调

时间:2014-01-30 01:45:28

标签: ember.js ember-data

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

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

我的路由器的模型如下所示:

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"
  }
}

1 个答案:

答案 0 :(得分:7)

Ember Data期待响应中的模型,因此发回成功的http状态并不意味着它会击中成功终点。当它试图序列化您的响应(或没有响应)时,它可能会失败,这就是它击中失败函数的原因。回复的一个重要原因是记录的id

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

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

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