2011-08-09 19 views
6

Mam problem z OO Javascript i wywołania zwrotnego jQuery. Jeśli spojrzysz na poniższy przykład, powinno to wszystko wyjaśnić.JQuery: Odwoływanie się do zakresu zewnętrznego w ramach wywołania zwrotnego

Jak wywołać functionToCall() głęboko w tym funktcepcji.

function outerClass() { 
    this.functionToCall = function() { 
     //do something 
    } 

    this.someOtherFunction = function() { 

    this.aCoupleOfVariables1 = 2; 
    this.aCoupleOfVariables2 = "stuff"; 

    $.ajax({ 
     success: function() { 
     //How do I call functionToCall() right here 
     //TRIED: 
      functionToCall(); 
      this.functionToCall(); 
      that.functionToCall(); 
     } 
    }); 
    } 
} 

Odpowiedz

14

można przekazać this jako opcja context do $.ajax():

$.ajax({ 
    context: this, 
    success: function() { 
     // Here, 'this' refers to the same object as in the caller. 
     this.functionToCall(); 
    } 
}); 
+3

Ooo, lubię to o wiele więcej. – Andrew

+2

Po prostu sidenote dla OP: kiedy tylko potrzebujesz skorzystać z "tego" i nie możesz użyć "context" lub jakiejkolwiek innej własności dla danej sprawy (wiele przypadków), http://api.jquery.com/jQuery .proxy/ – yoda

+0

Miło, to pozwala uniknąć użycia $ .proxy. –

6

mieć lokalne odniesienie do niej,

function outerClass() { 

    var self = this; 

    this.functionToCall = function() { 
    //do something 
    } 

    this.someOtherFunction = function() { 

    this.aCoupleOfVariables1 = 2; 
    this.aCoupleOfVariables2 = "stuff"; 

    $.ajax({ 
     success: function() { 
      self.functionToCall(); 
     } 
    }); 
    } 
} 
5

Trzeba zdefiniować that w zakresie zewnętrznej.

function outerClass() { 
    var that = this; 

    // ... 

    $.ajax({ 
     success: function() { 
      that.functionToCall(); 
     } 
    }); 
} 
4

trzeba zachować odniesienie do this value z zakresu macierzystego:

var parentScope = this; 

i dostęp functionToCall za pomocą tego przedmiotu

parentScope.functionToCall(); 

przykład:

function outerClass() { 
    var parentScope = this; 

    this.functionToCall = function() { 
     //do something 
    } 

    // ... 

    $.ajax({ 
     success: function() { 
      parentScope.functionToCall(); 
     } 
    }); 
} 

Innym sposobem byłoby użyć ES5 na .bind() aby ustawić wartość dla this obrębie wewnętrznej funkcji (-context)

$.ajax({ 
    success: function() { 
     // Here, 'this' refers to the same object as in the caller. 
     this.functionToCall(); 
    }.bind(this) 
}); 
2

Zachowaj zakres funkcji w zmiennej lokalnej i użyj jej lub możesz również użyć jquery proxy, w którym możesz określić kontekst.

function outerClass() { 
    this.functionToCall = function() { 
     //do something 
    } 

    this.someOtherFunction = function() { 

    this.aCoupleOfVariables1 = 2; 
    this.aCoupleOfVariables2 = "stuff"; 


    $.ajax({ 
     success: $.proxy(function() { 
      this.functionToCall(); 
     }, this) 
    }); 
    } 
} 
Powiązane problemy