2017-06-27 2 views
-1

Plusieurs pages peuvent afficher les données et la configuration actuelles et historiques. Nous voulons permettre à l'utilisateur de contrôler la quantité de données historiques affichées. Un paramètre pour cela est dans la session; le paramètre sera ajouté à une page de préférences et à la base de données. Notre méthode préférée pour effectuer un ajustement à la volée consiste à utiliser un contrôle DropDownChoice sur la page de base.Comment puis-je forcer le rendu d'une page depuis onSelectionChanged?

J'ai créé des classes de modèle et d'entité dans ma classe BasePage pour gérer ces valeurs.

private Integer setting; 
private String description; 

Le code pour le contrôle DropDownChoice:

private TermSettingEntity tsetting; 

private void buildCommon() 
{ 
    // Number of prior terms to show 
    tsetting = new TermSettingEntity(AlphPlusSession.get().getDateRange(), "dummy"); 
    TermSettingEntity[] toptions = new TermSettingEntity[] 
    { 
      new TermSettingEntity(0, "Current Term"), 
      new TermSettingEntity(1, "One Prior Term"), 
      new TermSettingEntity(2, "Two Prior Terms"), 
      new TermSettingEntity(-1, "All Terms") 
    }; 
    ChoiceRenderer<TermSettingModel> choiceRenderer = new ChoiceRenderer<TermSettingModel>("description", "setting"); 
    DropDownChoice<TermSettingModel> prefselect = new DropDownChoice<TermSettingModel>("termPref", 
      new PropertyModel<TermSettingModel>(this, "tsetting"), Arrays.asList(toptions), choiceRenderer) 
    { 
     private static final long serialVersionUID = 1L; 

     public boolean isVisible() 
     { 
      // Show on the side panel 
      return allowPreference; 
     } 

     protected boolean wantOnSelectionChangedNotifications() 
     { 
      return true; 
     } 

     protected void onSelectionChanged(final TermSettingModel newSelection) 
     { 
      System.out.format("onSelectionChanged(%s)%n", newSelection.getSetting().toString()); 
      AlphPlusSession.get().setDateRange(newSelection.getSetting()); 
      setResponsePage(getPage()); 
     } 
    }; 
    prefselect.setNullValid(false); 
    prefselect.setRequired(true); 
    add(prefselect); 
} 

je changé une valeur de session onSelectionChanged(..). L'appel à setResponsePage(getPage()) provoque la même réponse que de cliquer sur un rafraîchissement de page: les tables sont remplies, avec les mêmes données, mais il n'y a pas d'accès aux données pour obtenir plus ou moins de données.

Existe-t-il une méthode pour forcer l'ensemble de la WebPage à être réémise, y compris la récupération de données à partir de la base de données?

+0

Veuillez lire [Comment poser une bonne question?] (Http://stackoverflow.com/help/how-to-ask) avant d'essayer de poser d'autres questions. –

+0

Quiconque nuise aux réponses, veuillez laisser des commentaires expliquant pourquoi. –

Répondre

0

Serait bon d'avoir quelques détails sur le composant qui contient vos données historiques et comment vous le créez.

Peut-être la plus rapide mise à jour du code: Au lieu de setResponsePage(getPage()) vous pouvez utiliser setResponsePage(getPage().getClass()) Cela force une nouvelle instance de la page à créer (si votre page a besoin PageParameters les ajouter trop). Nettoyant: Si ce n'est pas encore fait, utilisez des modèles pour configurer vos composants. Vos composants devraient alors se mettre à jour. Voir https://cwiki.apache.org/confluence/display/WICKET/Working+with+Wicket+models

+0

L'ajout de l'appel 'getClass()' résout mon problème immédiat: la page entière est reconstruite. L'intégration de ce paramètre avec le reste du système (page de configuration, base de données) a à peine commencé. C'était déjà assez difficile de faire fonctionner 'DropDownChoice'. – JoeAB

0

Après onSelectionChanged() votre page entière sera restituée de toute façon, pas besoin de jouer avec setResponsePage().

Vos composants conservent des données périmées. Comme suggéré par l'utilisateur5474918, vous devez retravailler votre code pour utiliser correctement les modèles, par ex. au lieu de

new Label("id", foo.getBar()) 

... utiliser un indirection modèle:

new Label("id", new PropertyModel(fooModel, "bar")) 

PropertyModel est juste l'une des nombreuses solutions à cela.

+0

La page peut avoir appelé 'ListView # populateItem (..)' mais n'a pas exécuté 'List pastList = termService.getListOfPastTerms (institionId, AlphPlusSession.get(). GetDateRange())' dans le constructeur. Je ne comprends pas comment un 'Label' s'applique au contrôle 'DropDownChoice'. – JoeAB

+0

Un DropDownChoice fonctionne aussi avec des modèles, il suffit d'appeler le bon constructeur: https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/markup/html/ form/DropDownChoice.java # L159 Cela garantit qu'il fonctionne toujours sur des données à jour. – svenmeier

+0

Mentionner des modèles encore la plupart me confond.Dois-je créer des classes model, entity et renderer juste pour faire correspondre une valeur 'Integer' à (probablement unilingue) display' String's? – JoeAB