javascript - Ember JS,在状态为 root.loaded.updated.uncommitted 的 Transformer 处理事件 `didCommit` 中解析数据时出错。”

标签 javascript ember.js ember-data transformer-model

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

错误信息: “试图在状态 root.loaded.updated.uncommitted 上处理 <(DS.Model 的子类):ember1597:8260357> 上的事件 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 设置值但没有成功。我不太清楚这里出了什么问题,因此想不出解决办法。有人可以帮忙吗?提前致谢。

编辑

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

最佳答案

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

发生此错误的原因是因为 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 [];
    }

关于javascript - Ember JS,在状态为 root.loaded.updated.uncommitted 的 Transformer 处理事件 `didCommit` 中解析数据时出错。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21697991/

相关文章:

javascript - 当我更改选择标签时,为什么不在输入 id ="message"中显示数据?

javascript - _this6.function 不是一个函数

ember.js - Ember.js 支持哪些事件?

javascript - EmberJS 无法设置未定义的属性 'store' (DS.hasMany)

rest - 支持 HATEOAS 的 EmberJS DataStore 适配器

javascript - 使用 findAll() 函数时 Ember-Data 中的错误

javascript - jQuery Push() 返回错误 "undefined is not a function"

php - Javascript 对象到数组的转换以发送到 Php

JavaScript cookie,Ember

ember.js - 为什么 router.transitionTo 在转换到同一模型两次时会中止?