【问题标题】:Control Wicket wizard's flow by setting setComplete(boolean)通过设置 setComplete(boolean) 控制 Wicket 向导的流程
【发布时间】:2016-01-18 00:04:49
【问题描述】:

嘿,我仍在尝试改进定制的 Wicket 向导,以显示具有以下状态的步骤:活动、已完成、待定。因此isCompleted(); 的信息应该返回正确的值。引用previous questionisComplete();返回true,如果向导可以进行下一步。
我如何操纵这些信息以充分利用我的草稿?例如。在一个 WizardStep 中,我有多个输入字段。

super(new ResourceModel("daten.title"), new ResourceModel("daten.summary"));
java.util.Collections.addAll(sprachen, "Deutsch","English","Français","Italiano");

add(name = new RequiredTextField<String>("name", Model.of("")));
add(vorname = new RequiredTextField<String>("vorname",  Model.of("")));
add(strasse = new RequiredTextField<String>("strasse",  Model.of("")));
add(ort = new RequiredTextField<String>("ort",  Model.of("")));
...

在填写每个字段之前,我不希望该步骤“完成”。要检查条件,我必须为每个组件添加一个AjaxListener,并检查它的状态到setComplete(boolean);
我可以从向导表单之外控制这个流程吗?例如使用ICondition 的实现还是有其他方法?因为基本上我无法进行下一步,因为我所有的文本字段都是RequiredTextField,不能跳过。
任何建议都非常感谢。

更新/解决方案

Component buttonbar = getForm().get(Wizard.BUTTONS_ID);
buttonbar.setOutputMarkupId(true);

仅仅get(Wizard.BUTTONS_ID); 是行不通的。 感谢 Sven Meier 的提示!

【问题讨论】:

    标签: wicket conditional-statements wizard


    【解决方案1】:

    您必须向所有表单组件添加 AjaxFormComponentUpdatingBehavior。

    然后在您的向导中覆盖 #onEvent():

    public MyWizard(id, WizardModel model) {
        super(id, model);
    
        get(Wizard.BUTTONS_ID).setOutputMarkupId(true);
    }
    
    public void onEvent(IEvent<?> event) {
        if (event.getPayload() instanceof AjaxRequestTarget) {
             ((AjaxRequestTarget)event.getPayload()).add(get(Wizard.BUTTONS_ID));
        }
    }
    

    让您的 step#isComplete() 根据其模型值返回 true,这样向导按钮将始终是最新的。

    【讨论】:

    • 仍在检查您的建议,但get(Wizard.BUTTONS_ID).setOutputMarkupId(true); 抛出空指针异常。
    • 这一行((AjaxRequestTarget)event.getPayload()).add(get(Wizard.BUTTONS_ID)); 也抛出了空指针,但它似乎工作正常,我怎样才能避免空指针?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多