2011-12-14 75 views
1

我想使用XML保存我的應用程序中某些元素的配置。 在我的例子中,我想添加6個額外的配置集到一個「主」XML。每組可以是config1或config2。 在這種情況下,我添加了3x config1和3x config2。如果我追蹤我的結果,我不僅會得到錯誤的元素順序,還會出現一些「奇怪」的綁定行爲。 當然這是一個簡單的例子。我的配置集更復雜(這就是爲什麼我爲每個配置使用單獨的xml對象)。Flex 4.6 - XML appendChild意外行爲

有人可以告訴我這是應該如何工作?

感謝, 四字

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" applicationDPI="160" creationComplete="init();"> 

<fx:Declarations> 
    <fx:XML id="mainConfig" format="e4x"> 
     <allConfigSets> 
      <viewconfig>Baseconfig</viewconfig> 
     </allConfigSets> 
    </fx:XML> 

    <fx:XML id="configSet1" format="e4x"> 
     <configSet><viewconfig>Set1</viewconfig></configSet> 
    </fx:XML> 

    <fx:XML id="configSet2" format="e4x"> 
     <configSet><viewconfig>Set2</viewconfig></configSet> 
    </fx:XML> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
     private function init(): void {  

      mainConfig.appendChild(configSet1.viewconfig); 
      mainConfig.appendChild(configSet1.viewconfig); 
      mainConfig.appendChild(configSet1.viewconfig); 
      mainConfig.appendChild(configSet2.viewconfig); 
      mainConfig.appendChild(configSet2.viewconfig); 
      mainConfig.appendChild(configSet2.viewconfig); 

      // trace1 (see below): trace shows wrong order of elements 
      trace (mainConfig); 

      // trace2:(see below): changing data on original configSet seems to bind into mainConfig 
      configSet1.viewconfig = "-"; 
      trace (mainConfig); 
     } 
    ]]> 
</fx:Script> 
</s:Application> 

Trace1: 
<allConfigSets> 
    <viewconfig>Baseconfig</viewconfig> 
    <viewconfig>Set1</viewconfig> 
    <viewconfig>Set2</viewconfig> 
    <viewconfig>Set2</viewconfig> 
    <viewconfig>Set2</viewconfig> 
    <viewconfig>Set1</viewconfig> 
    <viewconfig>Set1</viewconfig> 
</allConfigSets> 

Trace2: 
<allConfigSets> 
    <viewconfig>Baseconfig</viewconfig> 
    <viewconfig>-</viewconfig> 
    <viewconfig>Set2</viewconfig> 
    <viewconfig>Set2</viewconfig> 
    <viewconfig>Set2</viewconfig> 
    <viewconfig>-</viewconfig> 
    <viewconfig>-</viewconfig> 
</allConfigSets> 

使用AS3 XML對象不解決這個問題:

private function init(): void {  
    var mainConfig:XML = <allConfigSets><viewconfig>0</viewconfig></allConfigSets> 
    var configSet1:XML = <configSet><viewconfig>1</viewconfig></configSet> 
    var configSet2:XML = <configSet><viewconfig>2</viewconfig></configSet> 

    mainConfig.appendChild(configSet1.viewconfig); 
    mainConfig.appendChild(configSet1.viewconfig); 
    mainConfig.appendChild(configSet1.viewconfig); 

    mainConfig.appendChild(configSet2.viewconfig); 
    mainConfig.appendChild(configSet2.viewconfig); 
    mainConfig.appendChild(configSet2.viewconfig); 

    // trace1 (see below): trace shows wrong order of elements 
    trace (mainConfig); 

    // trace2:(see below): changing data on original configSet seems to bind into mainConfig 
    configSet1.viewconfig = "-"; 
    trace (mainConfig); 
} 

Trace1: 
<allConfigSets> 
    <viewconfig>0</viewconfig> 
    <viewconfig>1</viewconfig> 
    <viewconfig>2</viewconfig> 
    <viewconfig>2</viewconfig> 
    <viewconfig>2</viewconfig> 
    <viewconfig>1</viewconfig> 
    <viewconfig>1</viewconfig> 
</allConfigSets> 

Trace2: 
<allConfigSets> 
    <viewconfig>0</viewconfig> 
    <viewconfig>-</viewconfig> 
    <viewconfig>2</viewconfig> 
    <viewconfig>2</viewconfig> 
    <viewconfig>2</viewconfig> 
    <viewconfig>-</viewconfig> 
    <viewconfig>-</viewconfig> 
</allConfigSets> 

回答

1

發生同時發生的變化,因爲您不斷追加多個引用到完全相同的節點(而不是新節點)。

認爲它這樣(僞代碼!):

<node1>value</node1> 

<node2> 
    <reference>Go, look at node1!</reference> 
    <reference>Go, look at node1!</reference> 
    <reference>Go, look at node1!</reference> 
</node2> 

只要遇到參考,返回存儲在節點1的值。當您更改原始值時,由於所有引用指向相同的節點,它們也會返回相同的新值。

要附加的節點,而不是原來的新副本,使用

mainConfig.appendChild(configSet1.viewconfig.copy()); 

,但請記住,複製()返回節點的整個子樹,而不只是節點本身的副本。

至於爲什麼元素順序錯了,我真的很茫然 - XML#appendChild()應該將元素添加到子節點列表的末尾。跟蹤(mainConfig.toXMLString());是否返回相同的結果?

-1

我猜,因爲你正在使用MXML來聲明XML數據,它被認爲是無論怎樣都可以綁定。 您應該在Actionscript中使用XML對象,然後嘗試執行此操作。 這可能是這裏的問題,因爲在ActionScript中,您需要明確使用[Bindable]標籤來使此綁定行爲。並且使用mxml,會自動將其初始化爲可綁定。

你可以嘗試一下,讓我們知道嗎? EIDT 1:似乎行爲是一致的,我發佈的答案是不正確的。我正在同時尋找解決方案。

+0

使用AS3 XML對象導致相同的行爲。如果一個xml被第二次追加,它不會追加在最後,而是在索引(1)上。同時更改原始對象將自動更改mainconfig對象。 – QuadWord 2011-12-14 14:41:20

+0

該問題與綁定完全無關。你應該刪除這個答案。 – weltraumpirat 2011-12-14 15:38:17