2016-01-06 2 views
0

im пытается назначить переменную внутри обратного вызова успеха ajax. Я знаю, что для присвоения значения мне нужно использовать функцию обратного вызова. но я хочу, чтобы эта функция находилась внутри класса. возможно ли реализовать что-то подобное?функция класса доступа внутри ajax success

function callMgmt_class() { 

     this.room_id    = 'Error'; 

     this.assignRoomVar = function(room_id) { 

      alert(); 
      this.room_id = room_id; 

     } 
     this.getRoomID = function() { 

      $.ajax({ 

       url: "/get_room_id.php", 
       dataType: "json", 
       success: function(data) { 

        this.assignRoomVar(data.room_id); 

       } 

      }) 

     } 
    } 

есть ли способ использовать bind? я попробовал:

success: function(data) { 

    (function() { this.assignRoomVar(data.room_id); }).bind(this); 

} 

поэтому я не получаю никаких ошибок, но функция не кажется, называется.

ответ

0

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

this.getRoomID = function() { 
     var me = this; 
     $.ajax({ 

      url: "/get_room_id.php", 
      dataType: "json", 
      success: function(data) { 

       me.assignRoomVar(data.room_id); 

      } 

     }) 

    } 
+0

это сработало отлично! Огромное спасибо!!! – Andrew

0

this не является this, который вы ищете.

Ключевое слово this сложно и использует разные ссылки в зависимости от контекста. Когда вы получаете доступ к в функции успеха ajax, он больше не ссылается на объект callMgmt_class (я думаю, что он ссылается на функцию ajax).

Лучший способ обойти это присвоение this другой переменной, если вы уверены в ее значении. Таким образом, на самого начало вашей функции является лучшим выбором

this.getRoomID = function() { 
    var that= this; 
    //Now use that instead of this when you want to refer to the callMgmt_class object 
    $.ajax({ 
     url: "/get_room_id.php", 
     dataType: "json", 
     success: function(data) { 
     that.assignRoomVar(data.room_id); 
    } 
    }) 
} 

Добавление:

Я думаю, что с помощью bind или apply другие альтернативы, но я не очень хорошо знакомы, так что я буду оставьте это для кого-то другого, чтобы ответить.