Ember.js 余烬:承诺(destroyRecord().then())请求成功失败

Ember.js 余烬:承诺(destroyRecord().then())请求成功失败,ember.js,ember-data,Ember.js,Ember Data,我对灰烬很陌生,但我已经花了几个小时来解决这个问题,不能靠我自己解决它。以下是我的路线(使用ember cli): 我正在触发模板中的deleteAccount操作(按钮)。有趣的是,代码实际上是在删除记录。它发送一个成功的删除请求,api删除该帐户。但它从不转换到accounts.index。而是记录“未删除帐户”。如果我手动转到account.index,那么模型就不再存在了(正如人们所期望的那样)。 我从官方的余烬文件中得到了密码。见: 那么,当模型被实际删除时,为什么承诺总是失败呢?非常

我对灰烬很陌生,但我已经花了几个小时来解决这个问题,不能靠我自己解决它。以下是我的路线(使用ember cli):

我正在触发模板中的deleteAccount操作(按钮)。有趣的是,代码实际上是在删除记录。它发送一个成功的删除请求,api删除该帐户。但它从不转换到accounts.index。而是记录“未删除帐户”。如果我手动转到account.index,那么模型就不再存在了(正如人们所期望的那样)。 我从官方的余烬文件中得到了密码。见:

那么,当模型被实际删除时,为什么承诺总是失败呢?非常感谢您的帮助


顺便说一句:这是一个以参数形式传递帐户id的编辑路由,因此不需要在路由上手动定义“模型函数”。以防万一有人想知道。

我想我已经解决了。destroyRecord()承诺失败的原因似乎是我的API响应了一个空的HTTP 200响应。但是200通常意味着返回一个实体,而事实并非如此。所以我修改了API以返回一个空的204响应,这就成功了。这个答案实际上帮助很大:

如果响应中包含 描述状态的实体,202(已接受)(如果操作尚未完成) 已颁布,或204(无内容),如果行动已颁布,但 响应不包括实体


嘿,
DELETE
请求的响应是什么?可能它是一个成功的
200
,但响应不被ember理解?它是一个空的HTTP 200 OK。就我而言,这应该是对删除请求的有效响应。完美答案。我只从这一篇文章中找到了答案!非常感谢你给我更好的解释<代码>标题:无内容带导轨
import Ember from 'ember';

export default Ember.Route.extend({
    actions: {
        save: function() {
            var controller = this.controller;
            controller.get('model').save().then(function(account) {
                console.log('account saved');
                controller.transitionToRoute('accounts.index');
            }, function(response) {
                console.log('account NOT saved');
            });

            return false;
        },
        deleteAccount: function() {
            var controller = this.controller;
            controller.get('model').destroyRecord().then(function(account) {
                console.log('account deleted');
                controller.transitionToRoute('accounts.index');
            }, function(response) {
                console.log('account NOT deleted');
            });

            return false;
        },
        cancel: function() {
            this.controller.get('model').rollback();
            this.transitionToRoute('accounts.index');
            return false;
        },
    }
});