1

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の1つを編集すると、割り当てられるノードが常にforループで最後に検出されるノードになることです。私はC#のこのパターンに慣れています。匿名関数が作成されるたびに、使用される値の値の「スナップショット」が取得されるため、「ノード」はハンドラー関数ごとに異なります。

ハンドラーで使用するノードの現在の値の「スナップショットを作成」するにはどうすればよいですか?または、Flexで別のパターンを使用する必要がありますか?

4

2 に答える 2

2

残念ながら、関数クロージャは Actionscript で奇妙に/不十分に動作します。変数は、範囲外になったときにのみ「スナップショット」を取得します。残念ながら、変数は関数スコープであり、ブロック スコープではありません。そのため、思い通りに動作しません。

TextInput -> nodeからマップする辞書を作成するか、 TextInput'sdata プロパティにノードを隠しておくことができます。

それを表現する簡単で強力な方法であるため、あなたが説明したことが正しく機能することを願っています.

于 2008-09-15T14:25:25.223 に答える
2

クロージャーは、現在の値ではなく、変数への参照のみをキャプチャします。ローカル変数は関数スコープ (ブロックスコープではない) であるため、ループの各反復では、同じ変数への参照をキャプチャするクロージャが作成されます。

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;
}
于 2008-09-15T16:24:07.510 に答える