2010-04-16 3 views
0

je tente de créer une page de la structure suivante:Comment utiliser le modèle dans le portillon?

MainPage { 
    DateSelector {} 
    TabGroup { 
     Tab0 {...} 
     Tab1 {...} 
     Tab2 {...} 
    } 
} 

dateSelector est un composant (Panneau extension) qui permet à l'utilisateur de sélectionner un laps de temps (startDate, endDate). TabGroup étendant "AjaxTabbedPanel". Les onglets affichés dans le TabGroup doivent utiliser le laps de temps sélectionné pour afficher le contenu. Par conséquent, si l'utilisateur sélectionne un intervalle de temps dans le sélecteur, le contenu de l'onglet sélectionné doit être mis à jour. Pour cela, j'implémente une méthode que l'utilisateur de DateSelector pourrait remplacer pour mettre à jour son contenu. J'ai le sentiment que mon approche est contre le cadre. Pourrais-je utiliser un modèle d'une manière ou d'une autre pour améliorer la mise en œuvre? Quel est le probleme avec ca? Les onglets peuvent-ils partager le timespan avec le DateSelector, de sorte qu'ils se mettent à jour si le timespan change? Sans le rappel?

Le dateSelector est mis en œuvre comme ceci:

abstract public class TimespanSelectionPanel extends Panel { 

    public TimespanSelectionPanel(String id, Timespan timespan) { 
     super(id, new CompoundPropertyModel<Timespan>(timespan)); 

     final DateTextField fromTextField = DateTextField.forDatePattern("from", "dd.MM.yyyy"); 
     fromTextField.setOutputMarkupId(true); 
     fromTextField.add(new DatePicker()); 
     final DateTextField toTextField = DateTextField.forDatePattern("to", "dd.MM.yyyy"); 
     toTextField.setOutputMarkupId(true); 
     toTextField.add(new DatePicker()); 

     fromTextField.add(new AjaxFormComponentUpdatingBehavior("onchange") { 
      @Override 
      protected void onUpdate(AjaxRequestTarget target) { 
      } 
     }); 
     toTextField.add(new AjaxFormComponentUpdatingBehavior("onchange") { 
      @Override 
      protected void onUpdate(AjaxRequestTarget target) { 
      } 
     }); 

     add(new AjaxLink<String>("today") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       updateComponent(fromTextField, toTextField, target, Timespan.today()); 
      } 
     }); 
     add(new AjaxLink<String>("yesterday") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       updateComponent(fromTextField, toTextField, target, Timespan.yesterday()); 
      } 
     }); 
     add(new AjaxLink<String>("lastMonth") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       updateComponent(fromTextField, toTextField, target, Timespan.lastMonth()); 
      } 
     }); 
     add(new AjaxLink<String>("actualMonth") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       Timespan timespan = adjustToTextField(fromTextField, toTextField, target, Timespan.actualMonth()); 
       updateComponent(fromTextField, toTextField, target, timespan); 
      } 
     }); 
     add(new AjaxLink<String>("fromTo") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       Timespan newTimespan = adjustToTextField(fromTextField, toTextField, target, fromTextField 
         .getModelObject(), toTextField.getModelObject()); 
       update(target, newTimespan); 
      } 
     }); 
     add(fromTextField); 
     add(toTextField); 
    } 

    private Timespan adjustToTextField(DateTextField fromTextField, DateTextField toTextField, 
      AjaxRequestTarget target, Timespan timespan) { 
     return adjustToTextField(fromTextField, toTextField, target, timespan.getFrom(), timespan.getTo()); 
    } 

    private Timespan adjustToTextField(final DateTextField fromTextField, final DateTextField toTextField, 
      AjaxRequestTarget target, Date from, Date to) { 
     Date today = DateUtil.today(); 
     if (to.after(today)) { 
      to = today; 
      toTextField.setModelObject(today); 
      target.addComponent(toTextField); 
     } 
     if (from.after(to)) { 
      from = to; 
      fromTextField.setModelObject(from); 
      target.addComponent(fromTextField); 
     } 
     return Timespan.fromTo(from, to); 
    } 

    private void updateComponent(final DateTextField fromTextField, final DateTextField toTextField, 
      AjaxRequestTarget target, Timespan newTimespan) { 
     fromTextField.setModelObject(newTimespan.getFrom()); 
     toTextField.setModelObject(newTimespan.getTo()); 
     target.addComponent(fromTextField); 
     target.addComponent(toTextField); 
     update(target, newTimespan); 
    } 

    abstract protected void update(AjaxRequestTarget target, Timespan timespan); 

} 

Répondre

0

Si le timespan est toujours en phase entre le sélecteur et les panneaux onglet, il est logique que c'est un modèle partagé. Cela signifie que vos onglets doivent avoir accès à un modèle qui fournit un TimeSpan, ou quelque chose comme un implémenteur ITimeSpanProvider (c'est-à-dire le composant sélecteur de plages de temps). Le premier est évidemment la meilleure façon de faire les choses dans Wicket. Ainsi, vos constructeurs de panneaux doivent utiliser un modèle TimeSpan, qui est ensuite utilisé par tous les composants qui le requièrent. Cela signifie que vous n'avez pas besoin de pousser les mises à jour du modèle du sélecteur vers les onglets. En fonction de la fonction de vos onglets, le modèle TimeSpan peut ne pas avoir de sens en tant que modèle "principal", mais c'est très bien - c'est juste un autre modèle. Si le modèle Timespan n'est pas défini en tant que modèle pour un autre composant dans vos onglets, vous devriez être gentil et détacher() le modèle le cas échéant, etc. Vous pouvez résumer tout ceci dans un TimeSpanAwarePanel s'il correspond à ce que vous êtes. Faire.

Questions connexes