2009-04-02 22 views
3

Ich benutze die Empfehlungen hier (http://www.odetocode.com/articles/473.aspx), um ein JavaScript AJAX Webchat-System mit simulierten Namespacing und Prototyping zu schreiben.Javascript 'Namespaces' und jQuery AJAX

In einem meiner Prototyp Methoden Ich rufe die $ .ajax Methode in jQuery. Dann möchte ich die zurückgegebenen JSON-Daten in eine Methode in meinem JavaScript-Webchat-Namespace übertragen.

Das Problem scheint zu sein, weil ich eine Instanz meines JavaScript-Webchats erstellt habe, kann ich nicht direkt eine Methode aufrufen, da ich es über die Instanz adressieren muss.

Der wichtigste Teil in dem folgenden Code ist

  success: function(data, textStatus) { 
       this.GetUpdate_Success(data) 
      }, 

Ich denke, weil wir in der $ Schnipsel() Methode sind, dass dies nicht mehr auf unser WebchatV3 Objekt.

Der vollständige JavaScript-Code ist unten dargestellt:

/// <reference path="/JavaScript/jquery-1.3.2-vsdoc2.js" /> 

// Simulated 'namespace' 
var AvonAndSomerset = {} 

// Chatroom run time data 
AvonAndSomerset.WebchatV3 = function(memberId, passcode) { 
    this.Members = new Array(); // Members in the chatroom 
    this.Questions = new Array(); // The questions queue in the chatroom 

// Details about the current user 
this.currentMember = new AvonAndSomerset.WebchatV3.Member(memberId, passcode, null, null, null, null, null); 

    // Set-up AJAX defaults 
    $.ajaxSetup({ type: "POST", contentType: "application/json; charset=utf-8", dataType: "json" }); 
} 

AvonAndSomerset.WebchatV3.prototype = 
{ 
    // Get latest Member,Quetsion,Transcript and Room data from server 
    GetUpdate: function(StartUp) { 

     $.ajax({ url: "JSON.aspx/Members_GetChanges", 
      data: "{ MemberID: " + this.currentMember.memberId + ", Passcode: \"" + this.currentMember.passcode + "\", ReturnAll: " + StartUp + " }", 
      success: function(data, textStatus) { 
       this.GetUpdate_Success(data) 
      }, 
      error: function(result) { 
       alert('Members_GetChanges() failed: ' + result.responseText); 
      } 
     }); 
    }, 
    // Callback - on success of GetUpdate() 
    GetUpdate_Success: function(data) { 
     alert('The AJAX call was successful!'); 
    }, 
    // Does the MemberID exist in the local array? 
    Members_DoesExist: function(MemberID) { 
     alert('Searching for ' + MemberID); 

     alert(this.Members.length); 
    } 

Antwort

5

Der einfachste Weg, um dies zu beheben, ist eine Variable zu erstellen, die this im richtigen Umfang referenziert. this und scope arbeiten in Javascript anders als die meisten anderen Sprachen, in diesem Fall bezieht sich das auf das Objekt, das in die Funktion übergeben wird.

// Get latest Member,Quetsion,Transcript and Room data from server 
GetUpdate: function(StartUp) { 
    //here 
    var self = this; 
    $.ajax({ url: "JSON.aspx/Members_GetChanges", 
     data: "{ MemberID: " + this.currentMember.memberId + ", Passcode: \"" + this.currentMember.passcode + "\", ReturnAll: " + StartUp + " }", 
     success: function(data, textStatus) { 
      self.GetUpdate_Success(data) 
     }, 
     error: function(result) { 
      alert('Members_GetChanges() failed: ' + result.responseText); 
     } 
    }); 
}, 
+0

Perfekt! Vielen Dank :) –

0

Versuchen
 success: function(data, textStatus) { 
      AvonAndSomerset.WebchatV3.GetUpdate_Success(data) 
     }, 

, die funktionieren kann.