1

XMLを使用して、アプリの要素の構成を保存したいと思います。私の例では、6つの追加構成セットを1つの「メイン」XMLに追加したいと思います。各セットはconfig1またはconfig2にすることができます。この場合、3xconfig1と3xconfig2を追加しました。結果をトレースすると、要素の順序が間違っているだけでなく、「奇妙な」バインディング動作も発生します。もちろん、これは単純化された例です。私の構成セットはより複雑です(これが、構成ごとに個別のxmlオブジェクトを使用する理由です)。

誰かがこれがどのように機能することになっているのか教えてもらえますか?

ありがとう、quadword

<?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>
4

2 に答える 2

1

(新しいノードではなく)まったく同じノードに複数の参照を追加し続けるため、同時変更が発生します。

このように考えてください (疑似コード!):

<node1>value</node1>

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

参照が検出されるたびに、node1 に格納されている値が返されます。元の値を変更すると、すべての参照が同じノードを指しているため、同じ新しい値が返されます。

元のノードの代わりにノードの新しいコピーを追加するには、次を使用します

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

ただし、copy() は、ノード自体だけでなく、ノードのサブツリー全体のコピーを返すことに注意してください。

要素の順序が間違っている理由については、私は本当に途方に暮れています - XML#appendChild()は子ノードのリストの最後に要素を追加する必要があります。トレース(mainConfig.toXMLString());は同じ結果を返しますか?

于 2011-12-14T14:36:58.737 に答える
-1

mxml を使用して xml データを宣言しているため、何があっても Bindable と見なされると思います。Actionscript で XML オブジェクトを使用してから、これを試してください。ここで問題になる可能性があります。ActionScript では、[Bindable] タグを明示的に使用してこのバインド動作を行う必要があります。mxml を使用すると、バインド可能として自動的に初期化されます。

それを試して、私たちに知らせてもらえますか?

EIDT 1: 動作に一貫性があり、投稿した回答が正しくないようです。同時に解決策を探しています。

于 2011-12-14T14:31:46.223 に答える