Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flex 4.6-XML意外行为_Xml_Apache Flex_Mobile_Flex4_Appendchild - Fatal编程技术网

Flex 4.6-XML意外行为

Flex 4.6-XML意外行为,xml,apache-flex,mobile,flex4,appendchild,Xml,Apache Flex,Mobile,Flex4,Appendchild,我想使用XML为我的应用程序中的元素保存一些配置。 在我的示例中,我想向一个“主”XML添加6个额外的配置集。每组可以是配置1或配置2。 在本例中,我添加了3x config1和3x config2。如果我跟踪我的结果,我不仅会得到错误的元素顺序,还会得到一些“奇怪的”绑定行为。 当然,这是一个简化的例子。我的配置集更复杂(这就是为什么我对每个配置使用单独的xml对象) 有人能告诉我这是怎么回事吗 谢谢, 四字 基本配置 Set1 Set2 跟踪1: 基本配置 Set1 Set2 Set2 S

我想使用XML为我的应用程序中的元素保存一些配置。 在我的示例中,我想向一个“主”XML添加6个额外的配置集。每组可以是配置1或配置2。 在本例中,我添加了3x config1和3x config2。如果我跟踪我的结果,我不仅会得到错误的元素顺序,还会得到一些“奇怪的”绑定行为。 当然,这是一个简化的例子。我的配置集更复杂(这就是为什么我对每个配置使用单独的xml对象)

有人能告诉我这是怎么回事吗

谢谢, 四字


基本配置
Set1
Set2
跟踪1:
基本配置
Set1
Set2
Set2
Set2
Set1
Set1
跟踪2:
基本配置
-
Set2
Set2
Set2
-
-
使用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>
private function init():void{
var mainConfig:XML=0
var configSet1:XML=1
var configSet2:XML=2
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(见下文):trace显示元素的错误顺序
跟踪(mainConfig);
//trace2:(见下文):更改原始配置集上的数据似乎绑定到mainConfig中
configSet1.viewconfig=“-”;
跟踪(mainConfig);
}
跟踪1:
0
1.
2.
2.
2.
1.
1.
跟踪2:
0
-
2.
2.
2.
-
-

我想,当您使用mxml声明xml数据时,无论发生什么情况,它都被认为是可绑定的。 您应该在Actionscript中使用XML对象,然后尝试这样做。 这可能是这里的问题,就像在ActionScript中一样,您需要显式使用[Bindable]标记来实现这种绑定行为。使用mxml会自动将其初始化为Bindable

你能试一下让我们知道吗


EIDT 1:行为似乎是一致的,我发布的答案是不正确的。我正在同时搜索解决方案。

同时发生的变化是,因为您不断向同一个节点(而不是新节点)添加多个引用

这样想(伪代码!):

但是请记住,copy()返回节点的整个子树的副本,而不仅仅是节点本身


至于为什么元素的顺序是错误的,我真的不知所措——应该将元素添加到子节点列表的末尾。跟踪
(mainConfig.toXMLString())返回相同的结果?

使用AS3 XML对象会导致相同的行为。如果一个xml第二次被追加,它将不会在末尾追加,而是在索引(1)上追加。同时,更改原始对象将自动更改mainconfig对象。问题与绑定无关。您应该删除此答案。@weltraumpirat或我可以建议其他方法并编辑答案。谢谢您的建议。当然,我可以看到这里发生了什么,但我的问题是:它真的应该以这种方式工作吗?在我看来,将原始对象附加到新对象后再引用它是没有意义的(对于XML)。看看由此产生的顺序“bug”,这是否真的是最初的意图是值得怀疑的。无论如何:使用.copy()可以解决这两个问题。仅当一个对象被多次引用时,才会出现排序问题。非常感谢你的帮助!它应该是这样工作的,因为可能有很好的理由使用引用而不是副本(有些模型需要比简单树结构更复杂的层次结构)。无论如何,我很高兴这有帮助-请接受我的回答,然后:)我明白你的意思。但是,如果这样做的话,appendChild也应该正确处理多个实例,而不是在现有节点之间追加它们:-)
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>
<node1>value</node1>

<node2>
    <reference>Go, look at node1!</reference>
    <reference>Go, look at node1!</reference>
    <reference>Go, look at node1!</reference>
</node2>
mainConfig.appendChild(configSet1.viewconfig.copy());