2011-12-14 6 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> 

Всякий раз, когда ссылка встречаются, значение, хранящееся в node1 возвращается. Когда вы меняете это исходное значение, так как все ссылки указывают на один и тот же узел, они также возвращают одно и то же новое значение.

Для добавления новых копий ваших узлов вместо оригинала, используйте

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

, но имейте в виду, что копирование() возвращает копию всего поддерева узла, а не только сам узла.

Что касается причин неправильного порядка элементов, я действительно в недоумении - XML#appendChild() должен добавить элементы в конец списка дочерних узлов. Ли трассировка (mainConfig.toXMLString()); возвращает тот же результат?

+0

, конечно, я вижу, что здесь происходит, но вопрос для меня: действительно ли он должен работать таким образом? , по моему мнению, нет смысла ссылаться на исходный объект, когда он добавляется к новому объекту (в случае XML). глядя на полученный в результате заказ «ошибка», сомнительно, если это было действительно оригинальное намерение. в любом случае: использование .copy() решает обе проблемы. проблема сортировки возникает только в том случае, если один объект ссылается несколько раз. Большое спасибо за помощь! – QuadWord

+0

Предполагается, что он будет работать таким образом, потому что могут быть веские причины иметь ссылки вместо копий (есть модели, которым требуется более сложная иерархия, чем простая древовидная структура). В любом случае, я рад, что это помогло - пожалуйста, примите мой ответ, тогда :) – weltraumpirat

+0

Я получаю вашу точку. но если это должно работать так, то appendChild также должен работать исправно с несколькими экземплярами и не добавлять их между существующими узлами :-) – QuadWord

-1

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

Вы можете попробовать это и сообщить нам?

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

+0

Использование объекта AS3 XML приводит к такому же поведению. если один xml получает добавление второй раз, он не будет добавляться в конце, а в индекс (1). Также изменение исходного объекта автоматически изменит объект mainconfig. – QuadWord

+0

Проблема не имеет ничего общего с привязкой. Вы должны удалить этот ответ. – weltraumpirat

+0

@weltraumpirat Или я могу предложить альтернативные способы и отредактировать ответ вместо этого. Спасибо за предложение. – Neeraj

 Смежные вопросы

  • Нет связанных вопросов^_^