2010-05-10 9 views
2

Je crée un mixin qui rend un fichier javascript quand un champ de texte gagne le focus. Je suis nouveau à l'idée de mixins dans Tapestry, et je ne suis pas sûr de l'endroit où placer mon fichier javascript original que je souhaite courir quand le champ de texte gagne le foyer.Aidez-nous à créer un mixin JavaScript dans Tapestry5?

Voici un exemple de mon code: La classe Java mixin:

package asc.mixins; 

import org.apache.tapestry5.RenderSupport; 
import org.apache.tapestry5.annotations.AfterRender; 
import org.apache.tapestry5.annotations.Environmental; 
import org.apache.tapestry5.annotations.IncludeJavaScriptLibrary; 
import org.apache.tapestry5.annotations.InjectContainer; 
import org.apache.tapestry5.corelib.base.AbstractTextField; 

@IncludeJavaScriptLibrary("js_dasher_mixin.js") 
public class DasherMixin { 

@Environmental 
private RenderSupport renderSupport; 

@InjectContainer 
private AbstractTextField field; 

@AfterRender 
void addScript() { 
    this.renderSupport.addScript("new JSDasher('%s');", 
      this.field.getClientId()); 
} 


} 

Le fichier mixin Javascript:

JSDasher = Class.create({ 

initialize: function(textField) 
{ 
    this.textField = $(textField); 

    this.textField.observe('focus', this.onFocus.bindAsEventListener(this)); 
}, 

onFocus: function(event) 
{ 
    //call my javascript init() function 
} 
} 

partie de mon fichier javascript je veux courir quand le champ de texte gains focus:

var posX, posY; 


// Sets up our global variables and dispatches an init request to the server. 
function init() { 

posX=0; 
posY=0; 
canvas = document.getElementById("canvas"); 
canvasWidth = canvas.offsetWidth; 
canvasHeight = canvas.offsetHeight; 
if (canvas.getContext) { 
    ctx = canvas.getContext("2d"); 
} 

canvas.onclick = canvasClicked; 
canvas.onmousemove = mouseMoved; 

canvasOffsetX = findPosX(canvas); 
canvasOffsetY = findPosY(canvas); 

sessID = -1; 

sendInitRQ(canvasWidth, canvasHeight); 

} 

Mon fichier javascript est beaucoup plus grand n ci-dessus, ma question est où devrais-je mettre mon code javascript ci-dessus?

Tout devrait-il être contenu dans le fichier mixin.js? si oui, où devrait-il aller exactement?

Merci d'avance pour toute aide.

Répondre

1

La méthode est ok free-floating dans mixin.js mais avec un nom comme init, vous pourriez avoir un conflit. Vous pouvez le placer dans la classe JSDasher ou déplacer le corps vers la fonction onFocus. Vous pouvez également définir toutes les autres fonctions de la classe JSDasher et les appeler avec this.function_name. Regardez le fichier datefield.js dans la source Tapestry à titre d'exemple.

+0

Merci pour votre réponse. Je suis encore un peu confus peut-être que je n'ai pas correctement posé ma question. Je sais où mettre le fichier mixin.js, je ne sais pas si je devrais avoir mon code js original séparé du fichier mixin.js. Si oui, comment puis-je appeler la méthode init() à partir de mon code js d'origine. Devrait-il être inclus dans le mixin.js? J'espère que cela a du sens. Merci encore. – shane87

+0

J'ai mis à jour la réponse parce que j'ai mal compris la question. –

+0

Merci encore ... juste une question de plus. Est-il possible d'appeler une méthode à partir d'un autre fichier javascript à partir du fichier mixin.js? Mon fichier javascript est très volumineux et envoie des requêtes à une socket php fonctionnant sur un autre serveur. J'ai donc besoin de garder mon code javascript à la racine de l'autre serveur avec le socket php. c'est-à-dire que je dois garder le code mixin.js séparé de mon autre code javascript. Qu'est-ce que je voudrais faire est en quelque sorte le crochet dans le code javascript externe dans l'événement onfocus. Toute aide ici serait géniale. – shane87