2009-09-24 2 views
0
var SortingTable = new Class({ 
      initialize: function(table, options) { 
       this.table=$(table); 
       this.tbody = this.table.getElement('tbody'); 
       //...do alot of things here... 
     }, 
      addTextInput : function(index,headid,options){ 
      var trs = this.tbody.getChildren(); 
      var trslen = trs.length; 
      var i=0; 
      var cell = null; 
      for(i=0;i<trslen;i++){ 
       cell = trs[i].getChildren()[index]; 
       cell.addEvent('dblclick', function (event){ 
         alert(this.innerHTML); // i can see this is the cell here. 
         this.makeCellEditor(this); // how to access the parent object? 
       }); 
      } 
      }, 
      makeCellEditor : function(cell){ 
       //make form and stuff here. 
      } 
    //...alot of more functions... 
}); 

В моей функции dblclick (event) я хотел бы получить доступ к моей функции makeCellEditor, которую я объявил в «родительском» объекте.Доступ к переменным и методам родительского объекта javascript?

ответ

3
var self = this; 
    cell.addEvent('dblclick', function (event){ 
        alert(this.innerHTML); // i can see this is the cell here. 
        self.makeCellEditor(this); 
      }); 
+0

Спасибо, что это сработало как очарование! – jonaz

1

Вы можете сохранить this ссылку на другой переменной, чтобы сделать его доступным для обработчика событий, что-то вроде этого:

addTextInput: function(...) { 
    var self = this; 

    ... 

    cell.addEvent('dblclick', function(event) { 
    self.makeCellEditor(this); 
    }); 
} 

Внутри обработчика событий, this относится к клетке и self доступен , через замыкание, в качестве ссылки на внешний объект this, SortingTable.

0

вы также можете связать анонимную функцию, добавив .bind (this); и изменить сферу «это» в классе, ячейка уже содержит ссылку на щелкнули объект, который можно использовать ...

for(i=0;i<trslen;i++){ 
    cell = trs[i].getChildren()[index]; 
    cell.addEvent('dblclick', function (event){ 
      alert(cell.get("html")); 
      this.makeCellEditor(cell); 
    }.bind(this)); 
} 

я, как правило, в пользу такого рода решения, как это не надо делать новая ссылка на весь класс (self = this), даже если это локальная область действия, но иногда она неизбежна.

Вы также можете это прочитать http://mootools.net/docs/core/Native/Function#Function:bindWithEvent

Смежные вопросы