我在 Ember Transformer 尝试在序列化函数中解析日期时遇到错误。
错误信息:
“尝试处理事件didCommit
在 上,同时处于 root.loaded.updated.uncommissed 状态。”
奇怪的是,数据被正确解析后传输到服务器。
Code:
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
但没有成功。我不太清楚这里出了什么问题,因此无法想出解决方案。有人可以帮忙吗?提前致谢。
edit
解决方法:
我将序列化移至控制器中。看起来不那么优雅,但目前可以使用......
正如您所发现的,ember 数据不喜欢使用set
在它的转变中。因为数据的服务器表示通常与客户端的表示方式不同。 Ember 希望转换不会修改serialized
or deserialized
传入的值而不是返回新值。
发生此错误的原因是 ember 有一个状态机来跟踪与服务器相关的记录的状态(请参阅http://emberjs.com/api/data/classes/DS.RootState.html 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 [];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)