2010-04-16 1 views
0

나는 다음과 같은 구조의 페이지를 만들려고 :개찰구에서 모델을 사용하는 방법?

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

DateSelector이 시간 범위 (은 시작일, 종료일)를 선택하도록 할 수있는 구성 요소 (확장 패널)입니다. "AjaxTabbedPanel"을 확장하는 TabGroup. TabGroup에 표시된 탭은 선택한 시간 범위를 사용하여 내용을 표시해야합니다.

사용자가 선택기에서 시간 간격을 선택하면 선택한 탭의 내용이 업데이트됩니다.

이 경우 나는 DateSelector 사용자가 내용을 업데이트 할 수있는 메서드를 구현합니다.

나는 프레임 워크에 대한 나의 승인이 있다고 생각한다. 구현을 향상시키기 위해 어떤 방법으로 모델을 활용할 수 있습니까? 이것에 '틀린'것은 무엇입니까? 탭이 DateSelector와 시간 범위를 공유 할 수 있습니까? 예를 들어 timespan이 변경되면 탭을 업데이트 할 수 있습니까? 콜백없이?

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

경우 공유 모델입니다, 다음이 의미가 있습니다.

이것은 탭 패널이 TimeSpan을 제공하는 모델 또는 ITimeSpanProvider 구현 자 (예 : 시간대 선택기 구성 요소)와 같은 것을 액세스해야 함을 의미합니다. 전자는 Wicket에서 일하는 더 좋은 방법입니다.

그래서 패널 생성자는 TimeSpan 모델을 가져와야하며,이 모델은 필요한 구성 요소에 의해 사용됩니다. 즉, 선택기에서 탭 패널로 모델 업데이트를 푸시 할 필요가 없습니다.

탭 패널의 기능에 따라 TimeSpan 모델이 "기본"모델로 이해되지 않을 수도 있지만 괜찮습니다. 단지 다른 모델 일뿐입니다. 시간 패널 모델이 탭 패널 내의 다른 구성 요소에 대한 모델로 설정되지 않은 경우, 적절할 때 모델을 분리하고() 모델을 분리해야합니다().이 모든 것을 TimeSpanAwarePanel로 추상화하여 원하는대로 만들 수 있습니다 하기.