Wicket AjaxLink isLinkEnabled()= false呈现可点击的范围

时间:2015-04-01 16:27:28

标签: java html wicket

我正在使用Wicket 6.11并遇到了一个奇怪的错误。我在整个大型应用程序中都有带有图标的wicket AjaxLinks,其isLinkEnabled()可以根据各种情况返回false。如果是这样,它会将链接呈现为您所期望的禁用(内部带有em标签的span标记),但是当我点击该图标时,该事件仍然会触发!

示例代码:

AjaxLink<Object> button = new AjaxLink<Object>( "editLocationButton" ) {

  private static final long serialVersionUID = 1L;

  public void onClick( AjaxRequestTarget p_target ) {
    // do things
  }

  /**
   * @see org.apache.wicket.markup.html.link.AbstractLink#isLinkEnabled()
   */
  @Override
  protected boolean isLinkEnabled() {
    return super.isLinkEnabled() && getSelectedLocation() != null;
  }
};

Html文件:

            <td style="width:0%">
                <a href="#" wicket:id="editLocationButton" class="editButton iconButton">
                    <wicket:message key="button.edit.location"></wicket:message>
                </a>
            </td>

禁用时呈现html:

<td style="width:0%">
    <span class="editButton iconButton" id="editLocationButton7b6"><em>

    </em></span>
</td>

editButton / iconButton CSS设置背景图像和宽度/高度。

查看Firefox元素检查器(而不是firebug),span有一些附加到它的事件触发了对服务器的ajax调用,那么为什么它们没有被禁用?这是Wicket中的一个错误吗?我只是发生了它,因为我试图点击在演示期间看起来被禁用的链接!

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

好吧,这似乎是AjaxLink实现中的一个错误。 它将使用以下实现添加AjaxEventBehavior:

    protected AjaxEventBehavior newAjaxEventBehavior(String event)
{
    return new AjaxEventBehavior(event)
    {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onEvent(AjaxRequestTarget target)
        {
            onClick(target);
        }

        @Override
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
        {
            super.updateAjaxAttributes(attributes);
            AjaxLink.this.updateAjaxAttributes(attributes);
        }
    };
}

正如您所看到的,此实现并不关心isLinkEnabled()方法是否已被覆盖。因此,唯一的解决方法是切换到isEnabled()此方法也将隐式停用该组件的所有子项。 (根据getSelectedLocation()方法的性质,我建议在组件的onConfigure()部分执行此操作

答案 1 :(得分:1)

要停用链接,您应在此链接上设置setEnabled(false),如下所示:

AjaxLink al = new AjaxLink("link") {

    @Override
    public void onClick(AjaxRequestTarget target) {
        //do something on click
    }

    @Override
    protected void onConfigure() {
        setEnabled(someCondition());
    }

};

方法boolean isLinkEnabled()只是一个帮手,因为它JavaDoc说:

  

辅助方法,它们都检查链接是否已启用和   是否允许动作ENABLE。