Область применения классов javascript и анонимные функции - PullRequest
1 голос
/ 20 октября 2011

У меня есть класс javascript, объявленный как показано ниже .. Моя проблема в том, что анонимная функция не видит область действия класса.Я не могу сослаться на bb_obj из обратного вызова загрузки вызова ajax ..

Есть ли способ сделать это?

Заранее спасибо ..

dojo.declare("sop.quote", null,
{
   bb_obj : new Object,

   stage1 : function()
   {
      dojo.xhrPost(
      {
         url      :  'go/module_service/transport.php',
         content  :  this.bb_obj,
         handleAs :  'xml',
         load     :  function(xml)
         {
            var status  = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
            var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue; 

            this.bb_obj.message = message;
         },
         error    : function()
         {
         }
      }
   }
}

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

this внутри функции обратного вызова XHR ссылается на объект XHR.Единственный способ обратиться к bb_obj - это непосредственная ссылка на созданный объект в той же области действия, что и функция.Поскольку объекты передаются по ссылке, приведенный ниже код работает как задумано.

Обратите внимание, чтобы избежать путаницы, я объявил объект, используя var bb_obj_obj={}.Свойство bb_obj относится к bb_obj_obj:

  • bb_obj_obj.message изменено
  • bb_obj указывает на bb_obj_obj, следовательно, bb_obj.message относится к той же переменной

Код:

var bb_obj_obj = {}; //new Object
dojo.declare("sop.quote", null,
{
   bb_obj : bb_obj_obj,

   stage1 : function()
   {
      dojo.xhrPost(
      {
         url      :  'go/module_service/transport.php',
         content  :  this.bb_obj,
         handleAs :  'xml',
         load     :  function(xml)
         {
            var status  = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
            var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue; 

            bb_obj_obj.message = message; //Without `this`
         },
         error    : function()
         {
         }
      }
   }
}

Альтернативный метод состоит в сохранении this в переменной, например.$this:

...
stage1 : function()
{
    var $this = this;
    dojo.xhrPost({
     ...
     load     :  function(xml){
        var status  = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
        var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue; 

        $this.bb_obj.message = message; //Using `$this` instead of `this`
     },
...
0 голосов
/ 20 октября 2011

Типичная практика Javascript, в данном случае, заключается в том, чтобы обернуть все это в безымянную функцию.Все локальные переменные этой функции будут доступны для каждого объявленного в ней объекта / функции.Немедленно вызывая эту безымянную функцию, вы убедитесь, что код внутри функции будет выполнен.

(function() {
 var bb_obj = {}

 dojo.declare("sop.quote", null,  {
   stage1 : function()
   {
      dojo.xhrPost(
      {
         url      :  'go/module_service/transport.php',
         content  :  this.bb_obj,
         handleAs :  'xml',
         load     :  function(xml)
         {
            var status  = xml.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue;
            var message = xml.getElementsByTagName("MESSAGE")[0].childNodes[0].nodeValue; 

            bb_obj.message = message;
         },
         error    : function()
         {
         }
      }
   }
})() 
...