![](/img/trans.png)
[英]Attempted to handle event `willCommit` on while in state root.loaded.updated.inFlight
[英]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希望转换不会修改传入的serialized
或deserialized
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.