Вопрос

В Flex у меня есть XML-документ, такой как следующий:

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

Во время выполнения я хочу создать элемент управления TextInput для каждого узла под root и привязать значения к значениям в 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 #, где каждый раз, когда создается анонимная функция, берется "моментальный снимок" значений используемых значений, поэтому "узел" будет отличаться в каждой функции-обработчике.

Как мне "сделать снимок" текущего значения node для использования в обработчике?Или я должен использовать другой шаблон в 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 -> узел, или вы могли бы спрятать узел в TextInput's свойство данных.

Я хотел бы, чтобы то, что вы описали, сработало правильно, поскольку это простой / мощный способ выразить это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top