我想使用XML为我的应用中的元素保存一些配置。 在我的例子中,我想为一个“主”XML添加6个额外的配置集。每个集合可以是config1或config2。 在这种情况下,我添加了3x config1和3x config2。如果我追踪我的结果,我不仅得到错误的元素顺序,而且还有一些“奇怪的”绑定行为。 当然这是一个简化的例子。我的配置集更复杂(这就是为什么我为每个配置使用单独的xml-objects)。
有人可以告诉我这应该如何运作吗?
感谢, 四字
<?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>
答案 0 :(得分: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());
是否会返回相同的结果?
答案 1 :(得分:-1)
我猜,因为您使用mxml来声明xml数据,所以无论如何都将其视为Bindable。 您应该在Actionscript中使用XML对象,然后尝试这样做。 这可能是这里的问题,因为在ActionScript中,您需要明确使用[Bindable]标签来实现此绑定行为。并且使用mxml会自动将其初始化为可绑定。
你可以尝试一下,让我们知道吗?
EIDT 1:似乎行为是一致的,我发布的答案不对。我正在寻找解决方案。