2013-09-28 2 views
0

Я использую класс модель Резига в (http://ejohn.org/blog/simple-javascript-inheritance/) и есть этот вопрос:Javascript модель класса: вызов функции класса из диалогового определения

В классе ниже я строй удаления диалога. Когда нажата кнопка «Да», я хотел бы выполнить функцию handleDeleteItem. Как мне это сделать? Я не могу использовать «this.handleDeleteItem», поскольку «this» относится к диалоговому окну.

var bItem = Class.extend({ 
    init: function (type) { 
     this.id = type + "-" + getNewId(); 
    }, 
    registerDelete: function() { 
     var itemId = this.id; 

     // Build Delete Dialog 
     var deleteDialog = '<div id="' + itemId + '-delete-dialog" title="Delete Item?"><p><br/><span class="ui-icon ui-icon-alert" style="float: left; margin: 0 7px 20px 0;"></span>Are you sure you want to delete this item?</p></div>'; 

     // Append dialog 
     $('#b-main').append(deleteDialog); 

     // Confirmation dialog 
     $('#' + itemId + '-delete-dialog').dialog({ 
      buttons : { 
       "Yes" : this.handleDeleteItem(), 
       "No" : function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 

     $("#dialog").dialog("open"); 
    }, 
    handleDeleteItem: function() {} 
}); 
+0

Итак, если 'this.handleDeleteItem' не разрешен, то' bItem.handleDeleteItem' в порядке? В любом случае '.handleDeleteItem()' возвращает undefined, что означает, что вы по существу привязываете «Да» к нулю. – Brian

ответ

0

Вы делаете все это неправильно. Попробуйте следующие вместо:

$('#' + itemId + '-delete-dialog').dialog({ 
    buttons : { 
     "Yes" : this.handleDeleteItem.bind(this), 
     "No" : function() { 
      $(this).dialog("close"); 
     } 
    } 
}); 

Обратите внимание, что я заменил this.handleDeleteItem() с this.handleDeleteItem.bind(this).

  1. Когда вы делаете this.handleDeleteItem() вы призывающую this.handleDeleteItem и назначая его возвращаемое значение в качестве слушателя событий для «Да».
  2. Когда вы делаете this.handleDeleteItem.bind(this), вы назначаете this.handleDeleteItem как прослушиватель событий для «Да». .bind(this) используется для обеспечения правильного указателя this.
+0

Спасибо за ваш ответ. Но проблема в том, что я не могу вызвать this.handleDeleteItem.bind (это), потому что первое «это» относится к диалоговому окну, и поэтому определение функции не найдено. – dutchman711

+0

@ user998066 Почему «этот» указывает на диалог? Он оценивается в области 'registerDelete'. Следовательно, 'this' будет указывать на экземпляр, а не на диалог. То, как я вижу это 'this.handleDeleteItem.bind (this)', должно работать должным образом. Попробуй. –

+0

Я понял, что я вызываю «this.handleDeteItem» внутри определения функции click(): $ ('#' + itemId) .click (function() {...}); В итоге я определил переменную для объекта, чтобы сохранить ссылку на нее, а затем вызвать функцию переменной, например. var myItem = this; , а затем: myItem.handleDeleteItem(); – dutchman711

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