2013-05-13 83 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