2

我在页面上添加了一个下拉组件。此下拉列表的目的是更改呈现的输入表单的类型。例如,不同的表单有不同的必填字段、可编辑字段等。

public final class Test extends WebPage
{

    CustomPanel currentPanel = new MeRequest("repeater",FormType.MIN);

    public Test(PageParameters parameters)
    {
        add(currentPanel);         

        DropDownChoice ddc = new DropDownChoice("panel", new PropertyModel(this, "selected"), panels, choiceRenderer);
        ddc.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            protected void onUpdate(AjaxRequestTarget target) {
                System.out.println("changed");
                currentPanel = new MeRequest("repeater",FormType.PRO);
                target.add(currentPanel);
            }
        });
        add(ddc);
    }

我尝试了各种选择,但结果有限。唯一真正的成功是更新模型,但我真正想做的是改变组件的行为方式。

对我所缺少的有什么想法吗?

4

1 回答 1

6

1) 如果您想用另一个面板替换一个面板,您可以执行以下操作。

首先,您应该输出原始面板的标记 id:

currentPanel.setOutputMarkupId(true);

然后在 ajax 事件处理程序中编写如下内容:

protected void onUpdate(AjaxRequestTarget target) {
    CustomPanel newPanel = new MeRequest("repeater", FormType.PRO);
    currentPanel.replaceWith(newPanel);
    currentPanel = newPanel;
    currentPanel.setOutputMarkupId(true);
    target.addComponent(currentPanel);
}

在这种情况下,每次更改下拉选项时,您都会将新面板添加到页面并从页面中删除旧面板。

2)但我会提出一种稍微不同的方法来解决你的问题。您应该将面板的构造逻辑移至 onBeforeRender() 方法:

public class MeRequest extends Panel {

    private FormType formType;

    public MeRequest(String id, FormType formType) {
        super(id);
        this.formType = formType;

        // don't forget to output the markup id of the panel
        setOutputMarkupId(true);

        // constructor without construction logic
    }

    protected void onBeforeRender() {
        // create form and form components based on value of form type
        switch (formType) {
            case MIN:
                // ...
                break;
            case PRO:
                // ...
                break;
        }            

        // add form and form components to panel
        addOrReplace(form);
        form.add(field1);
        form.add(field2);
        // ...

        super.onBeforeRender();
    }

    public void setFormType(FormType formType) {
        this.formType = formType;
    }
}

然后,您将只能在 ajax 事件中更改面板的类型:

protected void onUpdate(AjaxRequestTarget target) {        
    currentPanel.setFormType(FormType.PRO);
    target.addComponent(currentPanel);
}

因此,我们重建了原始面​​板而不重新创建它。

于 2012-10-17T20:47:46.610 回答