2010-04-16 52 views
0

我尝试创建以下结构的页面:如何在检票口使用模型?

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

DateSelector是一个组件(延伸面板),其使得用户能够选择一个时间范围(的startDate,结束日期)。 TabGroup扩展“AjaxTabbedPanel”。 TabGroup中显示的选项卡应该使用选定的时间范围来显示内容。

因此,如果用户选择了在选择器在所选择的选项卡内容应该更新一个时间跨度。

为此,我实现DateSelector的用户可以重写,以更新其内容的方法。

我有我的计算策略是对框架的感觉。我能否以某种方式利用模型来增强实施?这是什么“错误”?选项卡能否与DateSelector共享时间范围,以便在时间范围更改时更新?没有回调?

的DateSelector被实现这样的:

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); 

} 

回答

0

如果时间跨度总是在选择器和标签面板之间的同步,然后是有意义,这是一个共享的模型。

这意味着你的选项卡板需要一个或者供给时间跨度,或者类似的东西的ITimeSpanProvider实现者(即,时间跨度选择器部件)的模型的访问。前者显然是在Wicket做事情的更好方式。

所以,你的面板构造应采取时间跨度模型,然后使用任何组件都需要它。这意味着您不需要将模型更新从选择器推送到选项卡面板。

根据您的标签面板的功能,时间跨度模型可能是没有意义的“主”的模式,但是没有关系 - 它只是一个模型。如果时间跨度模型未设置为选项卡面板中另一个组件的模型,则应该很好,并在适当的时候将模型分离(等),等等。如果它符合您的要求,可以将其全部抽象为TimeSpanAwarePanel这样做。