代码之家  ›  专栏  ›  技术社区  ›  Arne Deutsch

如何使用Wicket中的模型?

  •  0
  • Arne Deutsch  · 技术社区  · 14 年前

    我尝试创建以下结构的页面:

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

    DateSelector是一个组件(扩展面板),使用户可以选择时间范围(startDate、endDate)。扩展“ajaxtabbedpanel”的选项卡组。选项卡组中显示的选项卡应使用选定的时间跨度来显示内容。

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

    为此,我实现了一个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);
    
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   ireddick    14 年前

    如果时间跨度始终在选择器面板和选项卡面板之间同步,则它是一个共享模型。

    这意味着您的选项卡面板需要访问提供时间跨度的模型,或类似于ITimesPanProvider实现者(即时间跨度选择器组件)的模型。前者显然是在wicket做事情的更好方式。

    因此,面板构造器应该采用TimeSpan模型,然后由任何组件使用。这意味着您不需要将模型更新从选择器推送到选项卡面板。

    根据选项卡面板的功能,TimeSpan模型作为“主”模型可能没有意义,但这没关系——它只是另一个模型。如果TimeSpan模型没有在选项卡面板中设置为其他组件的模型,则应该很好,并在适当时分离该模型,等等。如果它适合您所做的操作,则可以将其全部抽象为TimeSpanWarePanel。