Вызов метода JavaScript в определенной области - PullRequest
0 голосов
/ 02 марта 2011

Дорогие все, Я использую dojo.declare для создания классов в JavaScript. В одном из методов у меня есть запрос AJAX. В методе загрузки этого запроса мне нужно выполнить определенные методы. Эти методы на самом деле являются методами класса, который был создан с использованием dojo.declare. Я пытался выполнить метод, используя this. Но это дало мне метод не найденной ошибки. Поэтому я использовал dojo.hitch(this,testMethod), чтобы вызвать его. Работало нормально. Теперь проблема в том, что у меня есть много других методов также внутри testMethod(), который внутренне вызывает другие методы моего класса JavaScript. Это действительно больно иметь dojo.hitch () везде. Есть ли работа для этого.

    dojo.declare("TestClass",null,{

    getData:function(url){
    dojo.xhrGet({
      url:url,
      load: function (response){
        dojo.hitch(scope of the current object,testMethod(response))    
      },
      error:function(){

      }
    });
    },
    testMethod:function(response){
    //calls testMethod2. I think I can use dojo.hitch(this,testMethod3) to call it.
    //but I wanted to avoid doing it every time.
    },
    testMethod2:function(){
    //calls testMethod3
    },
    testMethod3:function(){
    //can call other methods.
    }
    });

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Это типичная проблема контекста.Вы передаете неконтекстированную функцию как свойство хэша конфигурации, которое передается в качестве аргумента dojo.xhrGet.

dojo.hitch - это именно та конструкция, которая необходима для добавления контекста в функцию.Другой способ - просто использовать закрытие.Есть ли причина, по которой вы не можете сделать:

var me = this;
dojo.xhrGet({
    url:url,
    load: function(response) {
        me.testMethod(response);
    }
});
2 голосов
/ 02 марта 2011

Кажется, что область выполнения была потеряна в этом коде:

load: function (response){
        dojo.hitch(this,testMethod(response))   
      },

Я сделал небольшие изменения в вашем коде. Теперь это должно работать правильно.

dojo.declare("TestClass",null,{

        getData:function(url){
        dojo.xhrGet({
          url:url,
          load: dojo.hitch(this,this.testMethod),
          error:function(){

          }
        });
        },
        testMethod:function(response){
           this.testMethod2();
        },
        testMethod2:function(){
           this.testMethod3();
        },
        testMethod3:function(){
        //can call other methods.
        }
        });
0 голосов
/ 04 марта 2011

Попробуйте сделать это следующим образом:

dojo.xhrGet({
   url:url,
   load: dojo.hitch(this, "testMethod"),
   error:function(){

   }
});

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

...