3

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

错误消息:“在状态 root.loaded.updated.uncommitted 时尝试处理didCommit<(DS.Model 的子类):ember1597:8260357> 上的事件。”

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

代码:

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但没有成功。我不太清楚这里出了什么问题,因此想不出解决办法。有人可以帮忙吗?提前致谢。

编辑

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

4

1 回答 1

1

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

发生此错误的原因是因为 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 [];
    }
于 2014-02-13T14:42:05.663 回答