Мне нужно получить доступ к контексту события И контексту объекта в обработчике событий

У меня есть этот фрагмент кода:

function ActivityDialog(_divId, _title) {

    function addButton() {
      var buttonElement = document.createElement('input');
      buttonElement.setAttribute('type','button');
      buttonElement.setAttribute('class','button');
      buttonElement.setAttribute('id','updateButton-' + id););
      buttonElement.onclick = this.updateAction;
    };

    function updateAction() {
      var buttonId = this.id; // correct: this is the Button
      this.sendUpdateRequest(stringUrl); // not defined: Need to reference the current ActivityDialog!!!    
    };

    function sendUpdateRequest(url) {
      // something...
    };

}

Как видите, проблема в том, что когда я вызываю функцию sendUpdateRequest;, как я могу одновременно получить информацию о кнопках и вызвать функцию?


person Alex    schedule 22.12.2011    source источник
comment
addyosmani.com/resources/essentialjsdesignpatterns/book/ Я надеюсь, что этот документ будет помощь   -  person Manuel Leduc    schedule 22.12.2011
comment
Я не понимаю в чем проблема.   -  person Lightness Races in Orbit    schedule 22.12.2011
comment
@ TomalakGeret'kal у него проблема с областью видимости, когда он пытается ссылаться на контекст события с помощью this (Button) и контекста объекта (ActivityDialog) в обработчике событий.   -  person jondavidjohn    schedule 22.12.2011
comment
@jondavidjohn: Было бы намного яснее, если бы все о кнопках и действиях было абстрагировано. Между тем, он использует this в одной строке, затем снова в следующей в той же области, но жалуется, что одно из этих применений дает результат, которого он не ожидал? Это бессмысленно.   -  person Lightness Races in Orbit    schedule 22.12.2011
comment
Наверное, потому что он чего-то не понимает ... как он посмел задавать вопрос о том, чего не понимает ... о, подождите ... где мы снова?   -  person jondavidjohn    schedule 22.12.2011


Ответы (1)


Вы можете попробовать это ...

function ActivityDialog(_divId, _title) {

    // Store the ActivityDialog context
    var self = this;

    function addButton() {
      var buttonElement = document.createElement('input');
      buttonElement.setAttribute('type','button');
      buttonElement.setAttribute('class','button');
      buttonElement.setAttribute('id','updateButton-' + id););
      buttonElement.onclick = this.updateAction;
    };

    function updateAction() {
      var buttonId = this.id;
      self.sendUpdateRequest(stringUrl); // <--------------------- 
    };

    function sendUpdateRequest(url) {
      // something...
    };

}

Поскольку вы используете updateAction в качестве обработчика событий, вы правильно видите, что this будет кнопкой, генерирующей событие. Сохранение начального контекста ActivityDialog позволит вам поддерживать доступ к нему даже в обработчиках событий.

person jondavidjohn    schedule 22.12.2011
comment
К сожалению, у меня уже есть проблема: sendUpdateRequest не определен. stringurl правильно оценен (я использую firebug для отладки) .. создание кнопки происходит в функции, определенной в объекте ActivityDialog. мне нужно сослаться на sendUpdareRequest, который является другой функцией ActivityDialog .. - person Alex; 22.12.2011