我正在使用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中的一个错误吗?我只是发生了它,因为我试图点击在演示期间看起来被禁用的链接!
感谢任何帮助,谢谢。
答案 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。