2009-10-08 11 views
1

J'étend le dojox.data.JsonRestStore de dojo et je veux fournir mon propre schéma fixe. c'est getUserName ne fonctionnera pas parce qu'il ne se réfère pas au courant datastore Jetez un oeil à ce code:Problèmes de portée Javascript

/** 
* @author user 
*/ 
dojo.provide("cms.user.UserAuthenticationStore"); 

dojo.require("dojox.data.JsonRestStore"); 

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], { 
    schema: { 
     prototype: { 
      getUsername: function(){ 
       return ???.getValue(this, "username"); 
      } 
     } 
    } 
}); 

Pouvez-vous me dire ce qu'il faut remplacer ??? avec?
EDIT:
Voici le code qui fonctionne mais c'est moche comme l'enfer, quelqu'un peut-il me dire comment résoudre ce problème?

/** 
* @author user 
*/ 
dojo.provide("cms.user.UserAuthenticationStore"); 

dojo.require("dojox.data.JsonRestStore"); 

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], { 
    schema: { 
     prototype: {} 
    }, 
    constructor: function(){ 
     var that = this; 
     this.schema.prototype.getUsername = function(){ 
      return that.getValue(this, "username"); 
     } 
    } 
}); 

Répondre

0

Voici la bonne façon de le faire:

/** 
* @author user 
*/ 
dojo.provide("cms.user.UserAuthenticationStore"); 

dojo.require("dojox.data.JsonRestStore"); 

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], { 
    schema: { 
     prototype: { 
      store: null, 
      getUsername: function(){ 
       return this.store.getValue(this, "username"); 
      } 
     } 
    }, 
    constructor: function(){ 
     this.schema.prototype.store = this; 
    }, 
    login: function(){ 

    }, 
    logout: function(){ 

    } 
}); 
1

Au lieu de:

this.schema.prototype.getUsername = function() { 
    return ???.getValue(this, "username"); 
} 

Vous pouvez essayer:

this.schema.prototype.getUsername = dojo.hitch(this, "getValue", <this>, "username"); 

où "<this>" est la variable qui est utilisée comme premier paramètre de la fonction getValue. Sinon, votre "that" n'est pas trop moche, mais les gens l'appellent habituellement "self" ou quelque chose.

Edit:

Peut-être que cela va fonctionner? Façon rapide et sale de créer un nouveau schéma. Sinon, vous pouvez créer un autre composant qui définit votre propre schéma séparément. Ensuite, vous pouvez simplement créer un "nouveau MySChema()" comme le "schema" var.

dojo.declare("cms.user.UserAuthenticationStore", [dojox.data.JsonRestStore], { 
    self: this, 
    schema: new (function() { 
       this.getUsername = function() { return self.getValue(this, "username"); } 
      } 
    })(); 
}); 
+0

Pourquoi dois-je faire cela sur le cteur? –

+0

Aussi c'est getUsername imo ... –

+0

Je ne suis pas votre commentaire getUsername. De toute façon, il n'y a aucune raison de le faire sur le constructeur. Je ne comprends même pas pourquoi vous utilisez la structure scheme.prototype. – Glenn

Questions connexes