2015-04-01 47 views
0

我正在使用Wicket 6.11并遇到了一个奇怪的错误。我将AjaxLinks的图标包含在大型应用程序中,其中isLinkEnabled()可以根据各种情况返回false。当它这样做时,它将链接视为禁用,就像你期望的那样(一个带有em标签的span标签),但是当我点击图标时,事件仍然会触发!Wicket AjaxLink isLinkEnabled()= false呈现可点击的范围

示例代码:

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%"> 
    <span class="editButton iconButton" id="editLocationButton7b6"><em> 

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

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

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

呈现的HTML 。

寻找Firefox元素检查器(不是萤火虫)跨度有一些附加到它的事件触发ajax调用到服务器,为什么他们没有被禁用?这是Wicket中的错误吗?我只是遇到了这个问题,因为我试图点击一个在演示期间看起来被禁用的链接!

任何帮助表示赞赏,谢谢。

回答

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()一部分期间)

+0

我同意。 Wicket可以在这里改进。请提交一张票https://issues.apache.org/jira/browse/WICKET,我们会解决它。谢谢! – 2015-04-02 07:37:52

+0

isLinkEnabled已在Wicket 7中删除[link](https://cwiki.apache.org/confluence/display/WICKET/Migration+to+Wicket+7.0#MigrationtoWicket7.0-AbstractLinknolongeraltersitsmarkuptorender itselfasdisabledWICKET-4904),我会争辩说如果isLinkEnabled不应该被使用,它不一定是一个错误的文档。 – fancyplants 2015-04-02 08:29:49

+0

它至少不一致。例如,AjaxFallbackLink有一个正确的实现。但由于它在Wicket 7中删除,我决定不报告它。 – 2015-04-02 12:46:34

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是否允许

的辅助方法。

+0

谢谢,这是isLinkables vs isEnabled,但我会推荐覆盖isEnabled,而不是设置它onConfigure – fancyplants 2015-04-02 08:22:38

+1

'isEnabled()'可能会被调用多次,因为'onConfigure()'只被调用一次,所以它被推荐设置可见性并在'onConfigure()'中启用 – 2015-04-02 09:25:13