2009-04-02 8 views
3

J'utilise les recommandations énoncées ici (http://www.odetocode.com/articles/473.aspx) pour écrire un système de discussion en ligne AJAX JavaScript en utilisant simulé Namespacing et le prototypage.Javascript 'Namespaces' et jQuery AJAX

Dans l'une de mes méthodes prototypes J'appelle la méthode $ .ajax dans jQuery. Ce que je veux ensuite faire est de transmettre les données JSON retournées dans une méthode à l'intérieur de mon espace de noms webchat JavaScript. Le problème semble être dû au fait que j'ai créé une instance de mon webchat en JavaScript, je ne peux pas appeler directement une méthode à l'intérieur car je dois l'adresser via l'instance.

La partie clé du code ci-dessous est

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

Je pense parce que nous sommes dans la méthode $ .ajax(), que ce ne fait plus référence à notre objet WebchatV3.

Le code JavaScript complet est présenté ci-dessous:

/// <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); 
    } 

Répondre

5

La solution la plus simple consiste à créer une variable qui référence this à la portée requise. this et scope fonctionnent différemment en javascript puis dans la plupart des langues, dans ce cas il s'agit de l'objet qui est passé dans la fonction.

// 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

Parfait! Je vous remercie :) –

0

Essayez

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

qui peut fonctionner.