2010-07-26 12 views
2

Salut les gars, Je voulais ajouter un événement AJAX à ma page d'accueil, mais ça ne marche pas! J'ai compris, que si je supprime la fonction onComponentTag cela fonctionne bien. Je n'ai aucune idée pourquoi cela s'est passé, peut-être que vous pouvez m'aider! Thats my code:Wicket AJAX + OnComponentTag

final TextField<String> searchInput = new TextField<String>("searchInput", model) { 

    @Override 
    protected void onComponentTag(final ComponentTag tag) { 
    super.onComponentTag(tag); 
    tag.put("id", this.getId()); 
    if (params.getString("search") != null) { 
     tag.put("value", params.getString("search")); 
    } 
    } 
    }; 

    searchInput.add(new AjaxFormComponentUpdatingBehavior("onfocus") { 
    @Override 
    protected void onUpdate(final AjaxRequestTarget target) { 
    System.out.print("never saw that message :("); 
    searchInput.setDefaultModelObject(""); 
    target.addComponent(searchInput); 
    } 

    }); 

Thx beaucoup pour me aider! CU

Répondre

5

Premièrement, il n'est pas nécessaire de surcharger onComponentTag(). En tant qu'analyseur, si votre vraiment doit spécifier vous-même un identifiant de balisage, utilisez setMarkupId (id). Vous devriez comprendre pourquoi il est recommandé que Wicket gère les identifiants de composants.

Deuxièmement, l'attribut de valeur que vous ajoutez n'est pas nécessaire - Wicket l'ajoute automatiquement pour ce composant. La valeur attribuée est la valeur de l'objet de modèle du composant. Voir la source de TextField.onComponentTag(). Troisièmement, à nouveau en tant qu'état de seanizer, les composants qui doivent être mis à jour par ajax doivent fournir leurs ID de balisage - L'implémentation ajax de Wicket utilise l'ID comme sélecteur pour l'élément. De plus, tous les comportements ajax de Wicket qui étendent AbstractDefaultAjaxBehavior définissent automatiquement outputMarkupId (true) sur le composant auquel ils sont liés (voir la source de AbstractDefaultAjaxBehavior.onBind()). Cela inclut AjaxFormComponentUpdatingBehavior.

Alors:

String id = "searchInput"; 
final TextField<String> searchInput = new TextField<String>(id, model); 
searchInput.setMarkupId(id); 

searchInput.add(new AjaxFormComponentUpdatingBehavior("onfocus") { 
    @Override 
    protected void onUpdate(final AjaxRequestTarget target) { 
    System.out.print("never saw that message :("); 
    searchInput.setDefaultModelObject(""); 
    target.setOutputMarkupId(true); 
    target.addComponent(searchInput); 
    } 
}); 

Enfin, je remets en question ce que vous essayez réellement de réaliser avec ce comportement. Je ne vois aucune raison de retourner cet événement au serveur. Certes, certains JS côté client est plus approprié?

+0

vous avez oublié setOutputMarkupId (true) :-) –

+0

Voir la source de AbstractDefaultAjaxBehavior.onBind() - le comportement définit le drapeau pour vous (désolé, ce n'était pas clair - J'ai édité ma réponse pour la rendre plus claire). – ireddick

5
tag.put("id", this.getId()); 

est pas la façon de le faire en guichet.

à la place, utilisez

component.setOutputMarkupId(true) 

(soit dans votre constructeur du composant ou dans votre méthode de liaison de comportement()) pour faire wicket écrire l'identifiant, et si vous avez absolument besoin de contrôler ce que l'id est (ce qui est presque jamais le cas), vous pouvez faire

component.setMarkupId("myId") 

aussi, vous ne devriez probablement pas affecter la valeur tag vous, utilisez un modèle (la manipulation du modèle est extrêmement intelligent dans wicket, lisez more about models). Il existe des utilisations valides pour onComponentTag, mais elles sont bien au-delà de ce que vous faites. Laissez guichet faire ce que le guichet fait le mieux et tout ira bien.


EDIT: OK, un peu plus de clarification

jeter un oeil à the source code of AjaxFormComponentUpdatingBehavior, en particulier la partie où le gestionnaire d'événements javascript est généré. Comme vous pouvez le voir, wicket utilise getMarkupId() pour déterminer l'identifiant réel. L'identifiant que vous définissez en utilisant tag.put (id) est totalement inconnu de wicket et par conséquent le comportement ne peut pas fonctionner.

La chose standard à faire est setOutputMarkupId (true). C'est la seule façon de dire à wicket de rendre l'id (autre que setOutputMarkupPlaceholder (true), qui appelle en interne l'ancienne méthode). De cette façon, vous vous assurez que les écritures d'ID Wicket est l'ID Wicket connaît. Si cela ne rend pas l'identifiant, vous écrasez probablement un comportement par défaut en écrasant onComponentTag.

Jetez un oeil à the source code of Component, en particulier à onComponentTag(), la méthode prépondérants:

protected void onComponentTag(final ComponentTag tag) { 
    // if(setOutputMarkupId(true) was set) 
    if (getFlag(FLAG_OUTPUT_MARKUP_ID)) { 

     // set id attribute 
     tag.put(MARKUP_ID_ATTR_NAME, getMarkupId()); 
    } 
} 

[Les commentaires sont à moi. BTW, c'est la source d'une ancienne version, mais je n'ai trouvé aucune source actuelle en ligne, et la fonctionnalité n'a pas changé.]

Maintenant si, comme dans votre cas, vous voulez définir l'identifiant du composant manuellement, vous devez utiliser

component.setMarkupId("myId") 

et bien sûr

setOutputMarkupId(true) 

ainsi. Si cela ne fonctionne pas, rendez-vous sur le site de wicket JIRA et déposez un bug. Mais j'en doute, c'est une fonctionnalité standard qui fonctionne pour des milliers d'utilisateurs.

+0

désolé mais je ne peux pas vous suivre. 1) J'ai essayé setOutputMarkupId (true) mais il n'imprime pas mon identifiant! J'ai besoin d'un identifiant pour mon CSS! 2) Je ne voulais jamais changer l'ID et ne le ferai jamais :) 3) cela ne résout pas mon problème :( Peut-être que je ne suis pas assez intelligent :) S'il vous plaît aider! – Sylvus

+0

voir ma réponse mise à jour. vous devez utiliser à la fois setMarkupId (myId) et setOutputMarkupId (true) –