2009-08-07 6 views
0

Ich habe einige Probleme mit dem klassischen JavaScript lokalen Variablenbereich Thema, aber Umgang mit einer JSON-Variable. Ich habe mir hier andere Fragen zu dem gleichen Thema angeschaut, aber nichts hat genau meinen Fall erreicht, also hier. Ich habe eine Klasse, die ich aus Javascript gemacht habe, das 3 Methoden hat: func1, func2 und func3. Ich habe auch eine lokale JSON-Variable, die in einer der Methoden von einem Ajax-Aufruf festgelegt wird, den ich mit jquery mache, aber wird nicht festgelegt, wenn ich eine Methode aufrufen, die diesen lokalen Variablenwert zurückgibt. Ich weiß, dass die Ajax funktioniert gut, b/c Ich kann die Daten, die zurückgegeben wird und auf die Json-Variable in Ordnung, ohne Probleme angezeigt werden. Es geschieht nur, wenn ich eine andere Methode aufrufen, die mit dieser JSON-Variable interagiert. Hier ist eine Basisversion von meinem Code:Benutzerdefinierte JavaScript-Klasse und private Variable Bereich Problem

function func1(){ 
     func2(); 
    } 

    function func2(){ 
     $.getJSON("http://webservice.mydomain.com/methodname&jsoncallback=?", 
     function(data){ 
      this.z = eval("(" + data.d + ")"); 
      alert(data.d); //this displays the data! 
      alert(this.z.ArrayProperty[0].Property1); //this displays 
                 //the correct data too! 
     } 
     ); 
    } 

    function func3(){ 
     return this.z.ArrayProperty[0].Property1; 
    } 

    function myClass(var1, var2){ 
     this.x = var1; 
     this.y = var2; 

     this.z = ""; 

     this.func1 = func1; 
     this.func2 = func2; 
     this.func3 = func3; 
    } 

Und dann in meiner HTML-Seite, ich habe den folgenden Code:

var obj = new myClass(1,2); 

obj.func1("abc"); 
alert(obj.func3()); //ERROR: this.z.ArrayProperty is undefined 

Irgendwelche Ideen?!?! Ich mache mir Sorgen!

Dank

Antwort

2

Ich glaube nicht, dass das etwas mit Rahmen zu tun ist.

Denken Sie daran, dass der AJAX-Aufruf asynchron ist, so dass func3 aufgerufen wird, bevor der JSON zurückgegeben wurde und Ihre anonyme Funktion die Möglichkeit hatte, diese.z auf irgendetwas einzustellen.

+0

Sie sind auf Sam. Jetzt muss ich nur noch einen guten Weg finden, um das zu umgehen. Vielen Dank! –

0

Ich glaube nicht, „this“ in Ihrem Rückruf der gleich „this“, dass definierte func2 ist. Mithilfe der JavaScript-Bibliothek "Prototype" können Sie bind() verwenden, um dies zu umgehen.

Sie können möglicherweise nur eine neue Variable in func2 hinzufügen, oder verwenden Sie eine Bindefunktion in welcher Bibliothek Sie verwenden.

func2() { 
    var me = this; 
     $.getJSON("http://webservice.mydomain.com/methodname&jsoncallback=?", 
      function(data){ 
       me.z = eval("(" + data.d + ")"); 
        success = true; 
        alert(data.d); //this displays the data! 
        alert(this.z.ArrayProperty[0].Property1); 
      } 
     );  
    } 
0

Ich könnte völlig falsch sein, aber es sieht aus wie die "diese" Variable Sie durcheinander bringt. Diese Variable hängt davon ab, wie Sie die Funktion aufrufen. Es sieht so aus, als würdest du das wirklich nicht benutzen wollen. Stattdessen verwende ich:

func2() { 
    var that = this; 

dann später im Code verwenden:

function(data){ 
    that.z = eval...