0
我发现了一个关于ComplexType属性的错误。我有一个Object,它有一个属性,它是我在客户端元数据中定义为Complex属性的其他对象的集合,即“isComplexType:true”。但是,复杂类型的所有属性都设置为“未定义”。我做了一些调试,发现:ComplexType属性阵列错误
// target and source may not be entities that can also be complexTypes.
function updatePropertyFromRawEntity(dp, target, rawSource) {
var val = getPropertyFromRawEntity(rawSource, dp);
if (val === undefined) return;
if (dp.isComplexProperty) {
var coVal = target.getProperty(dp.name);
dp.dataType.dataProperties.forEach(function (cdp) {
// recursive call
updatePropertyFromRawEntity(cdp, coVal, val);
});
} else {
target.setProperty(dp.name, val);
}
}
rawSource参数是一个数组(在complexTypes的情况下)是一个对象数组。所以,问题是调用getPropertyFromRawEntity()时,它通过阵列而不是一个对象:
function getPropertyFromRawEntity(rawEntity, dp) {
var propName = dp.nameOnServer || dp.isUnmapped && dp.name;
return parseValueForDp(rawEntity[propName], dp);
}
所以rawEntity [PROPNAME]总是未定义,因为它的阵列。
我明白你在说什么,但并非如此。未定义的属性不会是可观察的,我需要它。我也知道ComplexType具有明确的结构。我很确定代码中存在漏洞。快速解决方法是检查rawSource是否为数组并执行foreach循环。但是你可能比我更清楚Breeze里发生了什么。侧面的问题:有没有办法将整个对象树发回saveChanges服务器? – 2013-05-13 18:50:47
现在ComplexTypes的实例必须是标量,即它们不能是数组。我们将在即将发布的版本中放宽这一限制,我们将提供对NoSQL数据库的支持。这个代码是非常平凡的。至于将整个树发送回服务器,saveChanges方法允许您列出要保存的对象。 (默认仅发送添加/修改或删除的实体)。所以你需要走你的对象图,(并不难,因为你有entityMetadata可用),并收集你想保存的实体列表。 – 2013-05-14 02:12:19
您是否有估计何时发布下一个版本? – 2013-05-14 06:56:18