如何强制页面从onSelectionChanged中重新渲染?

时间:2017-06-27 21:22:09

标签: java wicket

多个页面可以显示当前和历史数据/配置。我们希望允许用户控制显示的历史数据量。对此的设置是在会话中;该设置将添加到首选项页面和数据库中。我们进行即时调整的首选方法是在基页上使用DropDownChoice控件。

我在BasePage类中创建了模型和实体类来处理这些值。

private Integer setting;
private String description;

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

我更改了onSelectionChanged(..)中的会话值。对setResponsePage(getPage())的调用会导致与单击页面刷新相同的响应:使用相同的数据重新填充表,但没有数据访问权来获取更多或更少的数据。

是否有方法强制重新发布整个WebPage,包括从数据库中重新获取数据?

2 个答案:

答案 0 :(得分:0)

获得有关包含历史数据以及如何创建历史数据的组件的详细信息会很棒。

可能是最快的代码更新: 而不是setResponsePage(getPage())您可以使用setResponsePage(getPage().getClass()) 这会强制创建新的页面实例(如果您的页面需要PageParameters也添加它们)。

清洁剂: 如果尚未完成,请使用模型设置组件。 你的组件应该自己更新。见https://cwiki.apache.org/confluence/display/WICKET/Working+with+Wicket+models

答案 1 :(得分:0)

在onSelectionChanged()之后,无论如何都会呈现整个页面,不需要使用setResponsePage()。

您的组件持有陈旧数据。正如user5474918建议的那样,您应该重新编写代码以正确使用模型,例如而不是

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

...使用模型间接:

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

PropertyModel只是其中的几种解决方案之一。