【问题标题】:Editing XML in Flex using e4x使用 e4x 在 Flex 中编辑 XML
【发布时间】:2008-09-15 14:05:47
【问题描述】:

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

我的问题是,当用户编辑其中一个 TextInputs 时,分配给的节点始终是 for 循环中遇到的最后一个节点。我习惯了 C# 中的这种模式,每次创建匿名函数时,都会拍摄所用值的值的“快照”,因此每个处理函数中的“节点”会有所不同。

如何“拍摄快照”节点的当前值以在处理程序中使用?还是应该在 Flex 中使用不同的模式?

【问题讨论】:

    标签: javascript apache-flex e4x


    【解决方案1】:

    闭包只捕获对变量的引用,而不是它的当前值。由于局部变量是函数范围的(不是块范围的),因此循环中的每次迭代都会创建一个闭包,该闭包捕获对同一变量的引用。

    您可以将 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;
    }
    

    【讨论】:

      【解决方案2】:

      不幸的是,函数闭包在 Actionscript 中的工作很奇怪/很差。变量只有在超出范围时才会获得“快照”。不幸的是,变量是函数范围的,而不是块范围的。所以它最终不会像你想要的那样工作。

      您可以创建一个字典以从 TextInput -> 节点 映射,或者您可以将节点存储在 TextInput's 数据属性中。

      我希望您所描述的内容能够正常工作,因为这是一种简单/强大的表达方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多