Frage

In Flex, ich habe ein XML-Dokument wie folgt:

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

Zur Laufzeit mag ich für jeden Knoten im Root-Verzeichnis ein Textinput-Steuerelement zu erstellen, und haben die auf die Werte in der XML-gebundenen Werte. Soweit ich sagen kann ich nicht BindingUtils verwenden kann, binden Knoten zur Laufzeit e4x (Bitte sagen Sie mir, wenn ich hier falsch bin!), So versuche ich, diese von Hand zu tun:

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

Mein Problem ist, dass, wenn der Benutzer eine der TextInputs bearbeitet, wird der Knoten zugewiesen bekommen immer die letzte in der for-Schleife auftreten. Ich bin auf dieses Muster von C # verwendet, wobei jedes Mal, wenn eine anonyme Funktion erstellt wird, ein „Momentaufnahme“ des Wertes der verwendeten Werte genommen wird, so „Knoten“ würde in jeder Handler-Funktion unterschiedlich sein.

Wie „einen Schnappschuss“ I des aktuellen Wertes des Knotens in dem Handler zu bedienen? Oder soll ich ein anderes Muster in Flex verwenden?

War es hilfreich?

Lösung

Der Verschluss fängt nur einen Hinweis auf die Variable, nicht seinen aktuellen Wert. Da lokal Variable Function-scoped (nicht quader scoped) bei jeder Iteration durch die Schleife erzeugt ist, einen Verschluss, der einen Verweis auf die gleiche Variable einfängt.

Sie könnten die Erstellung Code in eine separate Funktion TextInput- extrahieren, die Sie eine separate Variable Instanz für die Schließung zu erfassen geben würde. So etwas wie folgt aus:

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

Andere Tipps

Leider Funktion Verschlüsse arbeiten seltsam / schlecht in Actionscript. Variablen nur eine „Momentaufnahme“ erhalten, wenn sie sich außerhalb des Geltungsbereichs gehen. Leider Variablen Funktion scoped und nicht scoped blockieren. So ist es am Ende nicht funktioniert, wie Sie wollen.

Sie können ein Wörterbuch erstellen von TextInput- abzubilden. -> node , oder Sie können den Knoten in der TextInput's Eigenschaft data bunkern

Ich wünschte, was Sie beschrieben haben richtig funktioniert, da es eine einfache / leistungsstarke Möglichkeit ist, dass der Ausdruck zu bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top