apache-flex 使用e4x在Flex中编辑XML

7tofc5zh  于 2022-11-01  发布在  Apache
关注(0)|答案(2)|浏览(138)

在Flex中,我有一个xml文档,如下所示:

var xml:XML = <root><node>value1</node><node>value2</node><node>value3</node></root>

在运行时,我想为根目录下的每个节点创建一个TextInput控件,并将值绑定到XML中的值。据我所知,我不能在运行时使用BindingUtils绑定到e4 x节点(如果我错了,请告诉我!),所以我尝试手动完成此操作:

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);
}

我的问题是,当用户编辑其中一个TextInputs时,被赋值的节点总是在for循环中遇到的最后一个节点。我习惯了C#中的这种模式,在这种模式下,每次创建匿名函数时,都会对所用值的值进行“快照”,因此每个处理函数中的“节点”都是不同的。
我该如何“快照”node的当前值,以便在处理程序中使用?或者我应该在Flex中使用不同的模式?

wgxvkvu9

wgxvkvu91#

闭包只捕获对变量的 * 引用 *,而不是它的当前值。由于局部变量是函数作用域的(不是块作用域的),每次循环迭代都会创建一个捕获对同一变量的引用的闭包。
您可以将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;
}
eyh26e7m

eyh26e7m2#

不幸的是,函数闭包在Actionscript中工作得很奇怪/很差。变量只有在超出作用域时才能得到“快照”。不幸的是,变量是函数作用域的,而不是块作用域的。所以它最终不会像你想要的那样工作。
您可以创建一个字典来Map TextInput -〉node,或者将节点隐藏在TextInput's数据属性中。
我希望你所描述的确实有效,因为这是一种简单/有力的表达方式。

相关问题