Domanda

In Flex, ho un documento xml come la seguente:

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

In fase di runtime, voglio creare un TextInput di controllo per ogni nodo radice, e sono i valori associati ai valori XML.Per quanto mi riguarda posso dire che non posso usare BindingUtils di associare e4x nodi in fase di runtime (la prego di dirmi se ho sbagliato qui!), così sto cercando di farlo a mano:

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

Il mio problema è che quando un utente digita uno dei TextInputs, il nodo raggiungere assegnato è sempre l'ultimo rilevato nel ciclo for.Io sono abituato a questo modello da C#, dove ogni volta che una funzione anonima è creata un ' "istantanea" dei valori utilizzati i valori, in modo da "nodo" sarebbe diverso in ogni funzione del gestore.

Come faccio a "scattare una fotografia" dell'attuale valore del nodo per l'utilizzo del gestore?O dovrei usare un modello diverso in Flex?

È stato utile?

Soluzione

La chiusura cattura solo un riferimento per la variabile, non il suo valore attuale.Dal momento che le variabili locali sono Funzione del livello di ambito (non blocco a livello di ambito) ogni iterazione del ciclo crea una chiusura che cattura un riferimento alla stessa variabile.

Si potrebbe estrarre il componente TextInput creazione di codice in una funzione separata, che ti dia una variabile separata istanza per l'acquisizione per la chiusura.Qualcosa di simile a questo:

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

Altri suggerimenti

Purtroppo, le chiusure di funzione lavoro strano/male in Actionscript.Le variabili di ottenere solo un ' "istantanea" quando vanno fuori del campo di applicazione.Purtroppo, le variabili sono funzione del livello di ambito, e non bloccare ambito.In modo da non finire a lavorare come si desidera.

Si potrebbe creare un dizionario mappa TextInput -> nodo, o si potrebbe stash il nodo del TextInput's dati proprietà.

Desidero che ciò che hai descritto non funzionare correttamente in quanto è facile/potente mezzo per esprimere che.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top