OMG kaka ezoterika

Posted by Krof Drakula on Mar 1st, 2007

Bentim nad ActionScriptom 2.0. No, sicer je moja napaka, ker se še nisem čisto navadil na prototype-based language. Posledično me je nekaj zaj–alo v zvezi s tem.

Če si v PHP ali v vsakem klasičnem OO jeziku pisal metode znotraj klase in delegiral izvajanje neki funkciji ob eventu, računaš na to, da se kontekst metode nanaša na klaso objekta, na katerem se nahaja. Not so v ActionScriptu. In JavaScriptu, predvidevam, ker sta oba ECMAscript.

V glavnem, problem je takle:

class XMLLoader {
  private var xml_object:XML;
  public function XMLLoader(location:String) {
    this.xml_object = new XML();
    this.xml_object.ignoreWhite = true;
    this.xml_object.onLoad = this.xmlLoaded;
    this.xml_object.load(location);
  }
  private function xmlLoaded(success:Boolean):Void {
    trace(this);
  }
}

// nekje v timeline
var a:XMLLoader = new XMLLoader("myxml.xml");

Bi kdo rad uganil, kaj se izpiše v output oknu? Vsebina XML fajla. Tako je. Ne _level0.a, ampak vsebina XML fajla. Ker nastaviš XMLLoader::xmlLoaded funkcijo kot handler za onLoad event, le ta postane member objekta XML, in tako kontekst ključne besede this pade znotraj objekta XML.

Zabavno, ne?

Update: našel rešitev. Če hočeš izvesti zgornjo kodo, to narediš s pomočjo Delegate klase:

import mx.utils.Delegate;

class A {
  private var xml_input:XML;
  public function A(xml_location:String) {
    this.xml_input = new XML();
    this.xml_input.ignoreWhite = true;
    this.xml_input.onLoad = Delegate.create(this, onLoadXml);
    this.xml_input.load(xml_location);
  }
  private function onLoadXml(success:Boolean) {
    trace(this.xml_input.firstChild);
  }
}

// v timeline:
var a = new A("myxml.xml");

Rezultat je sedaj pričakovano vsebina XML datoteke myxml.xml.

  • sl.rReddit
  • del.icio.us
  • co.mments
  • Ma.gnolia

3 Responses

  1. Kobrowsky Says:

    HAHAHAHAHA!
    Daj še kakšnega!

  2. Krof Drakula Says:

    Oh, go write a poem or smth.

  3. Marko Says:

    Tvoj problem, kolikor ga razumem (ne uporabljam Flash, pišem pa preveč Javascripta) ni tolk v tem, da ima Javascript prototype-based OO, ampak je po moje problem scope-a.

    Pri event handlerji je prvi objekt znotraj scope-a event sam in ne objekt, v katerem je metoda definirana.

    Me pa veseli, da si našel workaround.

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.

To sem jaz.

  • Krof Drakula osebno.



  • N3rd badge.

G33K!

  • qrcode

Sla.st.no