ugrás a tartalomhoz

OO és az eseménykezelés

.adam · 2007. Júl. 18. (Sze), 20.08
Tiszteletem,

A következő problémába ütköztem, gondolom mással is előfordult: Egy osztály belselyében legyen a következő kód (én special az prototype.js-t használom, de szerintem a legtöbb eseménykezelőnél is ez a probléma előjön)

function MyClass(){
	
	this.foo = 42;
	
	this.myFunc = function(){
		
		var url = '...';
		var pars = '...';
		
		var myAjax = new Ajax.Request(
			url, 
			{
				method: 'get', 
				parameters: pars, 
				onComplete: this.processResponse
			}
		);
		
	};
	
	this.processResponse = function(response){
		
		// processing response...
		
		window.alert('foo is:' + this.foo);		// eredménye: foo is: undefined

		window.alert('foo is:' + myInstance.foo);	// eredménye: foo is: 42
	}
	
};
	
var myInstance = new MyClass();
Azt értem, hogy miért az undefined íródik ki, a kérdés az lenne, hogy hogyan lehet ezt elegánsan kivédeni? Hogy tudok a this.processResponse-ban hozzáférni a hívó referenciájához anélkül, hogy valami kókány megoldással globális változóhoz férnék, ami teljesen ellentmond az egységbezárásnak...

Valakinek van valami ötlete?

köszi: .a
 
1

lokális vagy bind

Pusztai Tibor · 2007. Júl. 19. (Cs), 01.44
1. megoldás: "this.processResponse" helyett "this.processResponse.bind(this)"
Bővebben a prototype doksijában olvashatsz.
2. megoldás: "this.foo = 42;" helyett "var foo = 42;" majd "this.foo" helyett "foo"
Egységbezárás szempontjából még jobb, mert így kívülről nem is lehet hozzáférni.

Ha már úgyis prototype-ot használsz, akkor miért nem Class-al készítesz osztályt?
2

Más módszer?

Ajnasz · 2007. Júl. 19. (Cs), 09.54
Hasonló problémával szoktam küzdeni én is.
Mozillával, prototype nélkül, a következő kódot hogyan kell átdolgozni, hogy az működőképes legyen?
var ize = function(val)
{
   this.bize = val;
   document.body.addEventListener('click', this.mize, false, this);
}

ize.prototype =
{
  bize:null,
  mize: function()
  {
    alert(this.bize);
  }
}

new ize('hopp');
3

talán így

Ajnasz · 2007. Júl. 19. (Cs), 11.14
Mintha ez így jó lenne:
var ize = function(val)
{
    this.bize = val;
    var hoze = function(obj)
    {
         return function() {obj.mize();}
    }
    document.body.addEventListener('click', hoze(this), false);
}

ize.prototype =
{
  bize:null,
  mize: function()
  {
    alert(this.bize);
  }
}
new ize('hopp'); 
4

köszönöm

.adam · 2007. Júl. 19. (Cs), 22.59
Mindkét megoldás működik, köszönöm :)