代码之家  ›  专栏  ›  技术社区  ›  Grokys

使用e4x在flex中编辑XML

  •  1
  • Grokys  · 技术社区  · 16 年前

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

    我的问题是,当用户编辑一个文本输入时,被分配到的节点总是在for循环中遇到的最后一个节点。我习惯于C中的这种模式,在C中,每次创建匿名函数时,都会获取所用值的“快照”,因此每个处理程序函数中的“节点”都不同。

    如何“获取”要在处理程序中使用的节点的当前值?还是应该在flex中使用不同的模式?

    2 回复  |  直到 6 年前
        1
  •  2
  •   bill d    16 年前

    关闭只捕获 参考 变量,而不是其当前值。由于局部变量是函数范围的(不是块范围的),所以每次循环都会创建一个闭包,捕获对同一个变量的引用。

    您可以将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
  •  2
  •   ColdFire    6 年前

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

    你可以创建一个字典来映射 文本输入->节点 或者您可以将节点存储在 TextInput's 数据属性。

    我希望你所描述的能够正确地工作,因为这是一种简单而有力的表达方式。

    推荐文章