无需服务器往返即可动态启用/禁用表单组件

时间:2013-07-11 17:30:20

标签: javascript wicket

我创建的表单只有在选中某个复选框时才能启用某些文本字段。

我对Wicket很新,我对以下内容感到好奇:

  1. 我可以使用现有的Wicket类在没有(AJAX)往返服务器的情况下启用/禁用该字段吗?即是否可以向字段添加行为,导致呈现的HTML包含启用/禁用字段的JavaScript?

  2. 如果上述问题的答案是:它是否合法"我可以在标记中自己添加所需的JavaScript代码吗?或者我是否存在弄乱表单提交的风险,以致Wicket无法正确识别它?

  3. 我是Wicket的新手,我不确定这里的最佳做法是什么。也许Wicket这样做的方式总是涉及AJAX往返?

2 个答案:

答案 0 :(得分:2)

  

我可以在没有(AJAX)往返的情况下启用/禁用该字段   服务器使用现有的Wicket类?即是否可以添加   对字段的行为导致呈现的HTML包含   启用/禁用字段的JavaScript?

是的,你可以在没有服务器往返的情况下完成。不,不是由Wicket提供的课程,你必须自己创建。这是您可以添加到组件的行为。如果单击具有此行为的组件,则将通过javascript:

禁用在构造函数中传递的目标组件
public class DisableFormComponentBehavior extends Behavior {

private Component sourceComponent;

private FormComponent targetComponent;

public DisableFormComponentBehavior(FormComponent targetComponent) {
    targetComponent.setOutputMarkupId(true);
    this.targetComponent = targetComponent;
}

public void bind(Component component) {
    super.bind(component);
    component.setOutputMarkupId(true);
    this.sourceComponent = component;
}

@Override
public void renderHead(Component component, IHeaderResponse response) {
    super.renderHead(component, response);
    response.render(JavaScriptHeaderItem
            .forReference(JQueryResourceReference.get()));
    response.render(OnDomReadyHeaderItem.forScript(String
            .format("$('#%s').click(function(){$('#%s').prop('disabled', true);});",
                    component.getMarkupId(), targetComponent.getMarkupId())));
}

}
  

如果上述问题的答案是否定的:我添加是否“合法”   标记中自己需要的JavaScript代码?或者我运行   弄乱表单提交的风险,使其不正确   被Wicket认可?

嗯,上面问题的答案并非“不”,但将自己的javascript添加到Wicket html文件仍然是完全合法的。但是,您必须在HTML中定义组件的ID。不过,我更喜欢使用Behaviors的解决方案,因为它更可重用。

答案 1 :(得分:0)

如果没有调用服务器,这绝对可行。一些非常基本的客户端Javascript / jQuery将做你想要的。看看here并将复选框替换为下拉列表。