繁体   English   中英

Ember JS,在状态为root.loaded.updated.uncommitted的Transformer handeling事件`didCommit`中解析数据时出错。“

[英]Ember JS, Error while parsing Data in Transformer handeling event `didCommit` in state root.loaded.updated.uncommitted."

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

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

编辑

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

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

发生此错误的原因是因为ember有一个状态机来跟踪与服务器相关的记录状态(请参阅http://emberjs.com/api/data/classes/DS.RootState.html )。 在这种情况下,ember很可能将记录置于inFlight状态。 然后它调用transform的serialize函数。 item.set ,ember会注意到对记录的更改,并且无意中将记录转换回uncommitted状态。 之后,服务器响应保存请求烬误假设成绩仍然是在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 [];
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM