2015-04-01 27 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