Setinterval, Scope, Delegate = Hilfe !

Denniz

Erfahrenes Mitglied
Hi Leute,

ich habe ein Verständnissproblem mit der delegate klasse und setinterval.
Ich habe ein Objekt dem folgende Methoden zugewiesen sind.

Code:
import mx.utils.Delegate;
myObj = new Object();
myObj.DisplayTrace = function(message) {
	trace(message);
};
myObj.init = function() {
	trace("INIT");
	var ID = setInterval(Delegate.create(this, DisplayTrace), 1000, "Interval called");
};
myObj.init();

Warum wird die DisplayTrace Methode nicht aufgerufen obwohl ich doch über delegate sage das das ScopeObject "this" also "myObj" ist.
Der Gültigkeitsbereich in dem die Funktion aufgerufen werden soll ist doch demnach korrekt. :confused:

Wenn ich die Funktionen nicht in das Objekt sondern zB auf _level0 lege, dann wird das Interval ausgeführt:
Code:
import mx.utils.Delegate;
myObj = new Object();
_root.DisplayTrace = function(message) {
	trace(message);
};
_root.init = function() {
	trace("INIT");
	var ID = setInterval(Delegate.create(this, DisplayTrace), 1000, "Interval called");
};
_root.init();

Was mache ich falsch, kann es mir jemand erklären? :confused:

Gruß
 
Hi,

soweit mir bekann ist, ist die Delegate-Klasse hauptsächlich für Event-Listener gedacht, d.h. dass die setInterval-Methode eventuell nicht damit umgehen kann.

Um Methoden in Intervallen im Kontext eines Objekts auszuführen, verwende die zweite Syntaxvariante der setInterval-Methode:
Code:
var obj = new Object();

obj.foo = function() {
	trace(getTimer());
}

var iv = setInterval(obj, "foo", 500);
Bei dieser Variante wird als erster Parameter das Zielobjekt (Kontext) und als zweiter der Funktionsname (als String) angegeben. Intervall und Parameter folgen an dritter und vierter Stelle.

Gruß
.
 
Hi,

ja, delegate wird meist mit eventlistener/dispatcher verwendet.
Aber setinterval kann damit auch umgehen.
So, jetzt hab ich entlich verstanden wie man mit delegate Methoden in Kontext eines Objekts laufen lassen kann und wie das setInterval daher richtig aussehen muß.
Kurzes Bsp:

Code:
import mx.utils.Delegate;
myObj1 = new Object();
myObj2 = new Object();
var ID;
myObj1.myFunc = function() {
	trace("interval cleared");
	clearInterval(ID);
};
myObj2.DisplayTrace = function(message) {
	trace(message);
	this.myFunc();
	//Hier könnte man schon das interval clearen da die Methode in Kontext von myObj1 läuft.
	//clearInterval(ID);
};
myObj1.init = function() {
	trace("INIT");
	ID = setInterval(Delegate.create(this, myObj2.DisplayTrace), 1000, "Interval called");
};
myObj1.init();
 

Neue Beiträge

Zurück