ugrás a tartalomhoz

swfobject callback

therest · 2012. Júl. 12. (Cs), 11.42
Sziasztok!

Van egy osztályom annak egy ref tulajdonsága valamint egy load és done metódusa.
A load metódus a swfobject.embedSWF metódusára támaszkodva betölt egy flash fájlt. Az embedSWF callback paraméterének a saját osztályom done metódusa van megadva, ahol szeretném az embedSWF által a callbacknek átadott paraméterből a ref tulajdonságot, a saját osztályom ref tulajdonságába menteni. A callbackben a this értéke azonban már a window objektum.

var mf=function() {
this.ref=null;
}

mf.prototype.done=function(result) {
 this.result=result; // undefined, mivel a this már a window itt
}

mf.prototype.load=function() {
swfobject.embedSWF('x.swf','xmovie',200,200,'8.0.0',"",{},{},{},this.done)
}
Eddig úgy oldottam meg, hogy a saját osztályom példányát egy asszociatív tömbben (objectumban) a flash id-jével megegyező id-jű indexen eltároltam. Az embedSWF callback-jének megadtam egy külön függvényt, ami a kapott paraméter alapján (mivel abban szerepel a flash id-je is), kikereste a megfelelő példányt, meghívta a done metódusát, aminek paraméterül adta a ref-et.

var mfs={}
function passref(result) {
mfs[result.id].done(result.ref);
}

mfs['xmovie']=new mf();
mf.load();
// az mfben az embedSWF hívásánál nem this.done, hanem a passref lesz a callback paraméter
Működik csak körülményes, csúnya. Hogyan lehetne ezt úgy megoldani, hogy a saját osztályom done metódusa tudja lekezelni?
 
1

scope

T.G · 2012. Júl. 12. (Cs), 13.01
Nem biztos, hogy értem a problémát teljesen, de a this –re megoldás lehet:

mf.prototype.load = function () {
	var me = this;
	swfobject.embedSWF(/* ... */, function (result) {me.done(result);});
};
2

Működik, köszi szépen. Ha jól

therest · 2012. Júl. 12. (Cs), 13.19
Működik, köszi szépen. Ha jól sejtem akkor ez a closure miatt van így. Ez még mindig szokatlan számomra, és nem jön zsigerből az ilyen megoldások használata.
3

Closure / bind

Poetro · 2012. Júl. 12. (Cs), 13.49
Módosítani kell az átadott függvényben a this értékét. Ezt meg lehet oldani closure-rel illetve bind-del, ami szintén closure-re épül, de nem minden böngészőben elérhető.
Például:
function caller(object, fun) {
  return function () {
    return fun.apply(object, arguments);
  }
}

swfobject.embedSWF('x.swf','xmovie',200,200,'8.0.0',"",{},{},{}, caller(this, this.done));
illetve
swfobject.embedSWF('x.swf','xmovie',200,200,'8.0.0',"",{},{},{}, this.done.bind(this)));
megjegyzés: a kódot nem próbáltam ki.