2013-05-13 60 views
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]总是未定义,因为它的阵列。

回答

0

A Breeze ComplexType具有由元数据指定的良好定义的结构。任何属性(除了该键)的数据类型都可以是complexType。然而,我认为你想要的是“无类型”结构。这可以通过定义该属性为具有“未定义”的数据类型来实现,类似:

var newProp = new DataProperty({ 
       name: "Foo" 
       dataType: DataType.Undefined, 
       isNullable: true, 
       isUnmapped: true 
      }); 
    entityType.addProperty(newProp); 

“未定义”数据类型将接受任何类型和结构的数据。

+0

我明白你在说什么,但并非如此。未定义的属性不会是可观察的,我需要它。我也知道ComplexType具有明确的结构。我很确定代码中存在漏洞。快速解决方法是检查rawSource是否为数组并执行foreach循环。但是你可能比我更清楚Breeze里发生了什么。侧面的问题:有没有办法将整个对象树发回saveChanges服务器? – 2013-05-13 18:50:47

+0

现在ComplexTypes的实例必须是标量,即它们不能是数组。我们将在即将发布的版本中放宽这一限制,我们将提供对NoSQL数据库的支持。这个代码是非常平凡的。至于将整个树发送回服务器,saveChanges方法允许您列出要保存的对象。 (默认仅发送添加/修改或删除的实体)。所以你需要走你的对象图,(并不难,因为你有entityMetadata可用),并收集你想保存的实体列表。 – 2013-05-14 02:12:19

+0

您是否有估计何时发布下一个版本? – 2013-05-14 06:56:18