2009-08-06 7 views
1

Je travaille sur le nouveau Palm Pre WebOS, les Apps for Palm Pre sont développées dans MojoSDK qui est développé en plus de Prototype Javascript Framework. J'essaie d'accéder aux variables définies au niveau de l'assistant dans les gestionnaires d'événements qui font également partie du même assistant. Lorsque j'accède aux variables de niveau assistant dans un gestionnaire d'événements, je l'obtiens comme non défini. Cependant, les variables sont accessibles dans la fonction de configuration.Variables Accès Prototype

Pour référence, un regard sur le code ci-dessous:

code:

function MyTestAssistant(passedValue) 
{ 
    this.passedValue = passedValue; 
} 

MyTestAssistant.prototype.setup = function() 
{ 
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Prints the value set in Constructor 
} 

MyTestAssistant.prototype.testListTapHandler = function(event) 
{ 
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Logs undefined 
} 

Quelqu'un d'autre est d'avoir ce problème ou je fais quelque chose de mal ici. Est-il possible d'accéder aux variables dans handler ou nous avons pensé à des solutions de contournement pour l'accomplir.

Dans l'attente d'obtenir une réponse bientôt.

Merci et salutations,

Muhammad Khan Hassib

+0

Pouvez-vous nous montrer le code où vous appelez ce gestionnaire d'événements? – RaYell

+0

Mojo.Event.listen (this.MyTestList, Mojo.Event.listTap, this.testListTapHandler); –

Répondre

3

Je ne suis pas familier avec Mojo-sdk, mais cela semble un peu comme vous avez juste mélangé votre « cette » référence lorsque vous définissez le gestionnaire d'événement. Selon toute vraisemblance, lorsque testListTapHandler est appelé, cela fait référence à l'objet qui déclenche l'événement. Prototype a la méthode très pratique bind() pour aider à dissiper cette confusion.

Je suppose que vous aviez quelque chose comme ça

elem.observe('eventname', myTestAssistant.testListTapHandler); 

Le problème, lorsque l'événement est déclenché, à l'intérieur testListTapHandler, cela se référer à élém. Pour corriger cela, nous lions le gestionnaire d'événements avec l'objet désiré:

elem.observe('eventname', myTestAssistant.testListTapHandler.bind(myTestAssistant)); 
0

J'ai trouvé la solution au problème. Un autre Forumhelped moi aussi.

Le problème principal, comme l'a souligné Paul, est lié à Binding and Scope.

Je mis à jour ma mise en œuvre à ce qui suit pour le faire fonctionner:

function MyTestAssistant(passedValue) 
{ 
    this.passedValue = passedValue; 
} 

MyTestAssistant.prototype.setup = function() 
{ 
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Prints the value set in Constructor 

    // Was Using the following code before and this.passedValue wasn't accessible in 
    // testListTapHandler 

    // Mojo.Event.listen(this.testList, Mojo.Event.listTap, this.testListTapHandler); 

    // Used the following code now and this.passedValue is accessible in 
    // testListTapHandler 

    this.testListTapHandler = this.testListTapHandler.bindAsEventListener(this); 
    Mojo.Event.listen(this.testList, Mojo.Event.listTap, this.testListTapHandler); 
} 

MyTestAssistant.prototype.testListTapHandler = function(event) 
{ 
    Mojo.Log.info("Passed Value Is: " + this.passedValue); // Prints the value set in Constructor 
} 

Merci pour votre aide Paul.

Cordialement,

Muhammad Khan haseeb