【问题标题】:Ember JS, Error while parsing Data in Transformer handeling event `didCommit` in state root.loaded.updated.uncommitted."Ember JS,在状态 root.loaded.updated.uncommitted 中解析 Transformer 处理事件 `didCommit` 中的数据时出错。
【发布时间】:2014-02-13 22:42:05
【问题描述】:

我在尝试在序列化函数中解析日期的 Ember 转换器中遇到错误。

错误信息: “在 root.loaded.updated.uncommitted 状态下尝试处理 上的事件 didCommit。”

奇怪的是,数据被正确解析后传输到服务器。

代码:

DS.Transform.extend({

    deserialize : function(serialized) {

        var array = [];

        if (Ember.isArray(serialized)) {

            serialized.forEach(function(item) {
                if (item.feldTyp === "DATE_FIELD" && item.value) {
                    Ember.set(item, "value", moment(item.value, "DD.MM.YYYY"));
                }
                array.addObject(Ember.Object.create(item));
            });
        }

        return array;
    },

    serialize : function(deserialized) {
        if (Ember.isArray(deserialized)) {
            deserialized.forEach(function(item) {
                if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) {
                    item.set('value', moment(item.get('value')).format("DD.MM.YYYY"));
                }
            });
            return deserialized;
        }

        return [];
    }
});

item.set('value', moment(item.get('value')).format("DD.MM.YYYY")); 行导致错误,因为注释掉错误消失。我尝试了其他方法,例如设置静态值或使用 Ember.set 设置值,但没有成功。我不太清楚这里出了什么问题,因此想不出解决方案。有人可以帮忙吗?提前致谢。

编辑

解决方法: 我将序列化移动到控制器中。看起来不那么优雅,但现在可以使用......

【问题讨论】:

    标签: javascript ember.js ember-data transformer


    【解决方案1】:

    您已经发现 ember 数据不喜欢在其转换中使用 set。因为数据的服务器表示通常不同于它在客户端的表示方式。 Ember 期望转换不会修改传入的 serializeddeserialized 值,而是返回新值。

    发生此错误的原因是 ember 有一个状态机来跟踪与服务器相关的记录的状态(请参阅http://emberjs.com/api/data/classes/DS.RootState.html)。在这种情况下,ember 很可能会将记录置于inFlight 状态。然后它调用转换的序列化函数。当item.set 被调用时,ember 注意到记录发生了变化,并无意中将记录转换回uncommitted 状态。在服务器响应保存请求后,ember 错误地假设记录仍处于inFlight 状态,发出didCommit 事件,因此记录可以转换到saved 状态。因为uncommitted 状态不支持didCommit 事件ember 会抛出错误。

    我怀疑您可以通过重写您的序列化函数以不调用 set 而是返回一个新数组来解决此问题。

        serialize : function(deserialized) {
            if (Ember.isArray(deserialized)) {
                return deserialized.map(function(item) {
                    if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) {
                        return moment(item.get('value')).format("DD.MM.YYYY");
                    }
                });
            }
    
            return [];
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      相关资源
      最近更新 更多