Autor Zpráva
Sarge
Profil *
Potřeboval bych poradit - když zavolám listener asynchronní operace uvnitř třídy, tak se z něj nedostanu na ostatní vlastnosti a metody:

class trida{

	public var vlastnost:String = 'neco';

	public function load_xml():Void {
		trace(this.vlastnost); // neco

		var xml_parser:XML = new XML();
		xml_parser.onLoad = this.loaded;
		xml_parser.load('data.xml');
	}
	private function loaded(success:Boolean):Void {
		trace(this.vlastnost); // undefined

	}
}


Je to jako by byla druhá metoda zavolána v jiném kontextu (staticky?). Takže se ptám, co s tím - jak se dostat zpět do kontextu třídy?
DoubleThink
Profil *
Tohle je nepříjemná vlastnost objektového modelu AS a velká část Flashových takypříruček ji s úsměvem ignoruje.

EventListener je vždy volán v kontextu instance objektu, takže buď je potřeba uvnitř něj používat jenom statické metody a vlastnosti, nebo raději použít třídu Delegate:

When you pass a function as a parameter to EventDispatcher.addEventListener(), the function is invoked in the scope of the broadcaster component instance, not the object in which it is declared (see Using ActionScript 2.0 Components). You can use Delegate.create() to call the function within the scope of the declaring object.

Takže ve tvém případě na začátek příjde:
import mx.utils.Delegate;

A se pak událost onLoad definuje takto
xml_parser.onLoad = Delegate.create(this, loaded);

Podrobněji tady.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: