我们在Breeze.js中有一个EntityQuery ,它带来了包含在一个实体实例中的数据以及来自相关实体的数据。
数据正确到达客户端。我可以看到来自服务器的响应,也可以在XHR.responseText中看到来自服务器的数据是正确的。
但由于某种原因,有时数据无法正确填充结果(即使用可观察对象构建的),可观察对象存在,但它们的值不正确。我明确指出,这只是有时。因为相同的查询没有更改,指向服务器上完全相同的实体实例,有时确实会正确填充结果。
由于在数据未正确解析或填充的情况下,我在 responseText 上看到了正确的数据,因此我实施了一个简单的解决方法/hack 来解决问题,但我想知道是否有其他更好的解决方法。
这是查询(出于保密原因,实体名称更改为 Op)和解决方法:
new breeze.EntityQuery('OpsWithRelatedData')
.where('Id', '==', id)
.using(self.EntityManager)
.execute()
.done(function (r) {
var op = r.results.pop();
// This is an ugly hack to prevent a Breeze problem
// (when it doesn't evaluate to an op correctly)
var evalOp = eval(r.XHR.responseText)[0];
if (evalOp.StatusId != op.StatusId()) {
viewModel.Op().StatusId(evalOp.StatusId);
viewModel.Op().Status().Id(evalOp.Status.Id);
viewModel.Op().Status().Name(evalOp.Status.Name);
} else {
viewModel.Op().StatusId(op.StatusId());
}
def.resolve(op);
});
一些附加信息:
- 此解决方法有效并且已经过测试。
- 此查询通常有效,但仅在这种情况下,当它在服务器上实体的状态更改后被触发时它不起作用(返回错误的状态 ID),但正确的状态值来自服务器的响应(已检查)。
- 所以肯定是客户端解析的问题。
- 结果总是被填充并且没有错误被抛出(测试添加失败处理程序)。问题是值不正确(并且与响应的 json 中的值不同)。
- 从我所看到的猜测,它似乎使用本地存储中的旧版本实体填充结果(???),虽然这看起来很奇怪,因为没有错误并且结果从服务器返回 OK . 而且填充的数据有时甚至与上次执行时的数据不匹配。
- 使用Breeze.js 版本 1.3.0会发生这种情况,尽管看起来我们可以测试迁移到当前版本 1.4.8 以查看是否可以解决问题,但我想先知道是否有其他问题修复它并防止像这里指出的问题的方法: Breeze.js parsing XHR.responseText,然后评估我们是否应该尝试任何选项或只是保留解决方法。
有任何想法吗?