Flex 4.6 - неожиданное поведение XML appendChild - PullRequest
1 голос
/ 14 декабря 2011

Я хочу использовать XML, чтобы сохранить некоторые настройки для элементов в моем приложении.В моем примере я хочу добавить 6 дополнительных наборов конфигурации в один «основной» XML.каждый набор может быть config1 или config2.В этом случае я добавил 3x config1 и 3x config2.если я отслеживаю свои результаты, я получаю не только неправильный порядок элементов, но также и какое-то «странное» поведение привязки.Конечно, это упрощенный пример.мои наборы конфигурации более сложны (вот почему я использую отдельные 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 Objects не решает эту проблему:

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>

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Одновременное изменение происходит, потому что вы продолжаете добавлять несколько ссылок на один и тот же узел (вместо новых узлов).

Подумайте об этом так (псевдокод!):

<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()); возвращает тот же результат?

0 голосов
/ 14 декабря 2011

Я полагаю, поскольку вы используете mxml для объявления данных XML, он считается привязываемым, несмотря ни на что.Вы должны использовать объект XML в Actionscript, а затем попробуйте сделать это.Это может быть проблемой здесь, так как в ActionScript вам нужно явно использовать тег [Bindable], чтобы иметь такое поведение привязки. И при использовании mxml он автоматически инициализируется как связываемый.

Можете ли вы попробовать это и позволитьмы знаем?

EIDT 1: Кажется, что поведение является последовательным, и ответ, который я разместил, не верен. Я одновременно ищу решение.

...