使用 e4x 在 Flex 中编辑 XML
-
09-06-2019 - |
题
在 Flex 中,我有一个如下所示的 xml 文档:
var xml:XML = <root><node>value1</node><node>value2</node><node>value3</node></root>
在运行时,我想为根下的每个节点创建一个 TextInput 控件,并将值绑定到 XML 中的值。据我所知,我无法在运行时使用 BindingUtils 绑定到 e4x 节点(如果我错了,请告诉我!),所以我尝试手动执行此操作:
for each (var node:XML in xml.node)
{
var textInput:TextInput = new TextInput();
var handler:Function = function(event:Event):void
{
node.setChildren(event.target.text);
};
textInput.text = node.text();
textInput.addEventListener(Event.CHANGE, handler);
this.addChild(pileHeightEditor);
}
我的问题是,当用户编辑 TextInput 之一时,分配到的节点始终是 for 循环中遇到的最后一个节点。我习惯了 C# 中的这种模式,每次创建匿名函数时,都会获取所用值的“快照”,因此每个处理函数中的“节点”都会不同。
如何“拍摄”节点当前值的快照以在处理程序中使用?或者我应该在 Flex 中使用不同的模式?
解决方案
闭包仅捕获 参考 到变量,而不是它的当前值。由于局部变量是函数范围的(而不是块范围的),循环中的每次迭代都会创建一个捕获对同一变量的引用的闭包。
您可以将 TextInput 创建代码提取到一个单独的函数中,这将为您提供一个单独的变量实例来捕获闭包。像这样的东西:
for each (var node:XML in xml.node)
{
var textInput:TextInput = createTextInput(node);
this.addChild(pileHeightEditor);
}
...
private function createTextInput(node:XML) : TextInput {
var textInput:TextInput = new TextInput();
var handler:Function = function(event:Event):void
{
node.setChildren(event.target.text);
};
textInput.text = node.text();
textInput.addEventListener(Event.CHANGE, handler);
return textInput;
}
其他提示
不幸的是,函数闭包在 Actionscript 中工作得很奇怪/很糟糕。变量只有在超出范围时才会获得“快照”。不幸的是,变量是函数作用域的,而不是块作用域的。所以它最终不会像你想要的那样工作。
您可以创建一个字典来映射 文本输入 -> 节点, ,或者您可以将节点隐藏在 TextInput's
数据属性。
我希望你所描述的能够正常工作,因为这是一种简单/强大的表达方式。
不隶属于 StackOverflow