2012-05-28 2 views
0

J'ai un problème avec ListView et la validation sur la page.Apache wicket: comment mettre à jour le formulaire explicitement?

J'ai ListView, et en dessous il y a TextField, où l'utilisateur peut entrer des valeurs. J'ai des boutons "publier" et "brouillon" sur ma page. Publier est un bouton, où popup (ModalWindow) est affiché, où l'utilisateur doit confirmer les données saisies. Enregistrer le brouillon est en cours d'enregistrement sans confirmation. Les deux sont des objets SecuredAjaxLink.

Lorsqu'un utilisateur entre des données dans TextField, il est enregistré dans ListView, mais la liste entière n'est pas mise à jour car l'utilisateur doit appuyer sur le bouton Ajouter ci-dessous. C'est acceptable.

Le problème est, que j'ai la validation métier, où les informations entrées par l'utilisateur sont vérifiées pour certaines règles. Lorsque la validation échoue tous les champs (contenant des informations erronées) sont mis en évidence avec css. Pour ajouter explicitement la valeur de TextField à ListView, je fais

target.addComponent(form); 

Ceci est effectué avant que les données ne soient validées. Donc, tous les champs sont mis à jour. Cela fonctionne très bien pour le bouton de publication (avec la confirmation ModalWindow), mais ne fonctionne pas avec le lien sans popup. Si je comprends bien, il y a quelque chose qui cloche avec le cycle de vie de la cible, mais je suis coincé avec elle.

Peut-être que quelqu'un avait quelque chose de similaire ou connaissait la réponse?

Comment puis-je mettre à jour la page sans utiliser de popup?

Voici le code: Projet de lien:

add(new SecuredAjaxSubmitLink(LinkNames.savelaterLink.toString(), form, 
       RoleController.CONTROLLER.getAccessController()) { 
      @Override 
      public void onSubmit(AjaxRequestTarget target, Form form) { 
       target.addComponent(form); 
       insert(appl, false, form, target, new MainMenu(getString("accept.application.draft.success.message")), trail, checkbox); 
      } 

Publier lien:

add(new CustomAjaxSubmitLink(LinkNames.submitLink.toString(), form, 
       RoleController.CONTROLLER.getAccessController()) { 
      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form form) { 
       target.addComponent(form); 
       publishPopup.show(target); 
      } 
     }); 

publishPopup.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { 
      public void onClose(AjaxRequestTarget target) { 
       if (ApplicationInsertActionPanel.this.getSelectedAction() != null 
         && ApplicationInsertActionPanel.this.getSelectedAction().equals(Action.CONFIRM)) { 
        insert(appl, 
          true, 
          form, 
          target, 
          new MainMenu(ApplicationInsertActionPanel.this 
            .getString("accept.application.publish.success.message")), trail, checkbox); 
       } 

      } 
     }); 

J'ai ajouté

@Override 
      protected void onError(final AjaxRequestTarget target, Form<?> form) 
      { 
       super.onError(target, form); 
       target.addComponent(form); 

à mon projet de lien, mais la page est pas entièrement mis à jour. Je suppose que c'est parce que le cycle de vie de la cible n'est pas terminé, comme s'il se terminait lorsque j'utilise une fenêtre contextuelle. La fenêtre contextuelle ouvre une "nouvelle page" et l'ancienne cible peut être mise à jour, mais lorsque je n'utilise pas de popup, la page reste comme avant. Donc maintenant je pense à une solution de contournement pour mettre fin au cycle de vie cible. Je pensais à la fenêtre contextuelle transparente sans aucune fonctionnalité, mais est vraiment une solution très sale.

Des idées? Merci! }

+0

Pouvez-vous montrer du code? – bert

+0

Modifié premier message. – psisoyev

Répondre

0

Mon anglais n'est pas si bien, et je ne comprends pas totalement Post. est-ce: tapez le mot dans Textfield -> un de ces boutons de soumission -> mot apparaît sur listview? si vous voulez valider l'entrée pourquoi ne pas vous utilisez une classe héritant de IValidator.class

et si vous souhaitez mettre à jour votre formulaire, vous pouvez ajouter un updatebehaviour à votre formulaire

final AjaxFormSubmitBehavior   formbehavior = new AjaxFormSubmitBehavior("onChange") { 
    @Override 
    protected void onError(AjaxRequestTarget arg0) { 
     arg0.add(getForm()); 
    } 

    @Override 
    protected void onSubmit(AjaxRequestTarget arg0) { 
     arg0.add(getForm()); 
    } 
}; 

vous pouvez ajouter ce comportement à votre forme ou l'étendre à vos besoins

form.add(formbehavior) 

je ne sais pas si votre problème est en quelque sorte lié à ma réponse, mais je suppose que vous vouliez savoir comment mettre à jour votre formulaire sans charger la nouvelle page.

+0

Merci pour votre réponse. J'essayais de mettre en œuvre quelque chose de similaire (avec des comportements), mais j'ai échoué. Il est une telle logique: tapez le mot dans TextField -> mot est ajouté à ListView, mais il n'est pas mis à jour, si l'utilisateur veut, pour ajouter de nouveaux, il doit appuyer sur le bouton ADD ci-dessous ListView. Et le dernier élément, qui reste dans TextField est ajouté dans ListView. -> boutons de presse utilisateur enregistrer brouillon/publier -> objet de modèle est envoyé à la logique métier pour la validation -> logique échoué et avec la page de publication est mis à jour et listview entièrement mis à jour, mais avec brouillon - n'est pas. Liste mise à jour, mais non mise en évidence avec validation (dernier élément) – psisoyev

+0

votre samplecode est plus énervant que d'aider, afficher le code du Textfield, le ListView aussi, leurs modèles et peut-être leurs comportements et ces liens. et si je l'ai compris, votre problème est avec le lien de brouillon (pourquoi pas de bouton?) qu'après validation la liste n'est pas mise en évidence sur erreur. Alors, comment la liste devrait-elle être mise en évidence? avec la couleur rouge? et as-tu essayé d'écrire ton propre Validateur? peut-être que vous pouvez faire une capture d'écran de ce que vous voulez dire si ppl peut imaginer, ce que vous voulez. – Sven

Questions connexes