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)
  1. function MyClass(){  
  2.       
  3.     this.foo = 42;  
  4.       
  5.     this.myFunc = function(){  
  6.           
  7.         var url = '...';  
  8.         var pars = '...';  
  9.           
  10.         var myAjax = new Ajax.Request(  
  11.             url,   
  12.             {  
  13.                 method: 'get',   
  14.                 parameters: pars,   
  15.                 onComplete: this.processResponse  
  16.             }  
  17.         );  
  18.           
  19.     };  
  20.       
  21.     this.processResponse = function(response){  
  22.           
  23.         // processing response...  
  24.           
  25.         window.alert('foo is:' + this.foo);     // eredménye: foo is: undefined  
  26.   
  27.         window.alert('foo is:' + myInstance.foo);   // eredménye: foo is: 42  
  28.     }  
  29.       
  30. };  
  31.       
  32. 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?
  1. var ize = function(val)  
  2. {  
  3.    this.bize = val;  
  4.    document.body.addEventListener('click'this.mize, falsethis);  
  5. }  
  6.   
  7. ize.prototype =  
  8. {  
  9.   bize:null,  
  10.   mize: function()  
  11.   {  
  12.     alert(this.bize);  
  13.   }  
  14. }  
  15.   
  16. new ize('hopp');  
3

talán így

Ajnasz · 2007. Júl. 19. (Cs), 11.14
Mintha ez így jó lenne:
  1. var ize = function(val)  
  2. {  
  3.     this.bize = val;  
  4.     var hoze = function(obj)  
  5.     {  
  6.          return function() {obj.mize();}  
  7.     }  
  8.     document.body.addEventListener('click', hoze(this), false);  
  9. }  
  10.   
  11. ize.prototype =  
  12. {  
  13.   bize:null,  
  14.   mize: function()  
  15.   {  
  16.     alert(this.bize);  
  17.   }  
  18. }  
  19. 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 :)