javascript - 使用 e4x 在 Flex 中编辑 XML

标签 javascript apache-flex e4x

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

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

在运行时,我想为根目录下的每个节点创建一个 TextInput 控件,并将值绑定(bind)到 XML 中的值。据我所知,我不能在运行时使用 BindingUtils 绑定(bind)到 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 中使用不同的模式吗?

最佳答案

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

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

关于javascript - 使用 e4x 在 Flex 中编辑 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63181/

相关文章:

javascript - NodeJS 正则表达式匹配字符串中的 4 位数字与 'OR' 字

database - 如何通过 Flex/Air App 进行本地数据库管理

apache-flex - Flex 截断按钮标签

apache-flex - ActionScript:包级内省(introspection)?或者其他一些可插入的加载方案?

javascript - E4X浏览器支持

xml - E4X:抓取带有命名空间的节点?

javascript - 在jquery中查找标签内的标签并替换内容

javascript - Node.js:访问mysql数据库

javascript - ajax 提交带有漂亮 URL 的请求

javascript - E4X 与 NodeJS