【问题标题】:Bad state in delete action with Ember Data使用 Ember 数据进行删除操作时状态不佳
【发布时间】:2014-01-07 05:02:36
【问题描述】:

我正在尝试将我认为是来自索引控制器的非常简单的 ember 删除操作(基于此示例:http://discuss.emberjs.com/t/migrating-from-ember-data-0-13-to-1-0-0-beta-1-my-findings/2368)放在一起,我想我一定遗漏了一些东西。

actions: {
  deleteZone: function (zone) {
    if (confirm("Are you sure you want to delete the zone?")) {
      var _this = this;

      zone.deleteRecord();

      zone.save().then(
        function () {
          _this.transitionToRoute('zones.index');
        },
        function (error) {
          zone.rollback();
        }
      );
    }
  }
}

当我尝试删除具有相应依赖项的区域时遇到了麻烦。在这种情况下,服务器(Rails 4)会抛出异常并返回以下 JSON:

{"status":422,"message":"Cannot delete record because of dependent projects","errors":{}}

但是,虽然我相信服务器会返回正确的错误,但 UI 似乎在它到达那一步之前就失败了。如果我在 catch 函数内的 zone.rollback() 之后的行上放置一个调试器,我会收到此错误:

Attempted to handle event `becameInvalid` on <App.Zone:ember1276:6> while in state root.deleted.inFlight. Called with {}.

我在 ember 1.4.0-beta.1、ember-data 1.0.0-beta.4 (ActiveModelAdapter) 和 rails 4.0.1 上运行。任何建议将不胜感激,谢谢!

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    回滚后手动转换到loaded.saved状态似乎可以解决问题:

    zone.transitionTo('loaded.saved');
    

    升级到最新的 ember/ember-data 并稍微修改 JSON 响应后,我现在可以使用传递给 catch 表达式的错误引用从 JSON 中提取错误消息。

    {"status":422,"message":"translation missing: en.Invalid zone","errors":{"base":["Cannot delete record because dependent projects exist"]}}
    

    还有 ember 版本:

    DEBUG: Ember      : 1.4.0-beta.1+canary.4d69bca7 ember.js?body=1:3307
    DEBUG: Ember Data : 1.0.0-beta.5+canary.2e773365 ember.js?body=1:3307
    DEBUG: Handlebars : 1.0.0 ember.js?body=1:3307
    DEBUG: jQuery     : 1.10.2 
    

    【讨论】:

      【解决方案2】:

      我也遇到过这个问题。运行 model.transitionTo('loaded.saved'); 有助于避免抛出的任何错误,模型也会被破坏。

      如果想要将模型保留在商店中,则必须重新注入,这看起来很奇怪,但很有效:

      var model = this.get('model');
      var store = model.store;
      model.deleteRecord();
      model.save().catch(function(err){
          model.transitionTo('loaded.saved');
          var payload = model.serialize({includeId: true});
          store.unloadRecord(model)
          store.pushPayload('nestedSet',{nested_set:payload});
      });
      

      我正在跑步:

      DEBUG: -------------------------------
      DEBUG: Ember      : 1.8.0-beta.1+canary.d6d4f01d
      DEBUG: Ember Data : 1.0.0-beta.9
      DEBUG: Handlebars : 1.3.0
      DEBUG: jQuery     : 1.11.1
      DEBUG: -------------------------------
      

      对于版本测试完整性,ember-data#1.0.0-beta.7!

      如果有人也遇到这种情况,希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-04
        • 1970-01-01
        • 2014-05-04
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多