2013-07-25 47 views
0

我有一個帶有AjaxLazyLoadPanel的頁面,它包含一個長加載列表並提交AjaxButton。在延遲加載期間AjickButton上的Wicket-hide元素

在AjaxLazyLoadPanel準備就緒後,當我提交時,另一個長時間加載正在執行,之後我需要刷新整個頁面。這是我自己的代碼,代碼看起來如下:

AjaxButton button1 = new AjaxButton("submit1") { 
     @Override 
     protected void onSubmit(AjaxRequestTarget target, Form form) { 
      someLongWorkingMethod(); 
      setResponsePage(page); //refreshing page 
     } 
    }; 
    add(button1); 

它的工作原理完美。但是現在我想要做的是 - 在方法計算時禁用此按鈕或隱藏此按鈕(或者在必要時隱藏整個面板),以及使用setResponsePage刷新頁面時,我希望將此按鈕返回。

我已經看了很多帖子/郵件列表吧,但沒有幫助我,我想,我發現和someLongWorkingMethod()之前把它所有的東西:

ajaxLazyLoadPanel.setOutputMarkupId(true); 
ajaxLazyLoadPanel.setOutputMarkupPlaceholderTag(true); 
ajaxLazyLoadPanel.add(new AttributeAppender("style","display:none;")); 
ajaxLazyLoadPanel.setVisible(false); 
ajaxLazyLoadPanel.setEnabled(false); 
target.add(ajaxLazyLoadPanel); 

而同樣不是ajaxLazyLoadPanel但「這個」(AjaxButton)。

我在做一些非常錯誤的事情嗎?這是我試圖做甚至可能的嗎?我真的很感謝一些幫助。

+1

如果我理解正確的話,好像是,你可以立即刷新頁面按鈕的'onClick'及處理'someLongWorkingMethod()'的' ajaxLazyLoadPanel'?如果這是不正確的,請提供一些關於用例的更多信息。 – OnesAndZeros

+0

@OnesAndZeros - 我想你是對的,但我認爲這樣做會很複雜,因爲在頁面加載時已經有LazyLoadPanel和另一個長載列表和這個按鈕。所以,我認爲我應該刷新頁面,然後在LazyLoadPanel執行someLongWorkingMethod()。但我不想在第一頁加載時這樣做 - 這將是我想 – Horuss

+0

的問題你可以使用一個單獨的構造函數或只傳遞一個布爾標誌來觸發一個條件語句,只有當來自你的按鈕...實際上,我想知道你是否不能僅僅使用setResponsePage()的ajax功能insead,但是隻需要將面板設置爲骯髒,以便它可以重新加載?你可以把你的按鈕放在lazyLoadPanel中,這樣一旦面板返回到加載模式,它就會消失(顯示微調器而不是組件)? – OnesAndZeros

回答

1

在您的AjaxButton中,您可以覆蓋updateAjaxAttributes()並添加一個IAjaxCallListener,該按鈕在單擊該按鈕後立即通過jQuery隱藏該按鈕。當responsePage被渲染時,按鈕再次出現。對於重寫代碼如下所示:

@Override 
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { 
    super.updateAjaxAttributes(attributes); 
    attributes.getAjaxCallListeners().add(new IAjaxCallListener() { 

     @Override 
     public CharSequence getBeforeHandler(Component cmpnt) { 
      return "$(\"#" + cmpnt.getMarkupId() + "\").hide()"; 
     } 

     @Override 
     public CharSequence getPrecondition(Component cmpnt) { 
      return ""; 
     } 

     @Override 
     public CharSequence getBeforeSendHandler(Component cmpnt) { 
      return ""; 
     } 

     @Override 
     public CharSequence getAfterHandler(Component cmpnt) { 
      return ""; 
     } 

     @Override 
     public CharSequence getSuccessHandler(Component cmpnt) { 
      return ""; 
     } 

     @Override 
     public CharSequence getFailureHandler(Component cmpnt) { 
      return ""; 
     } 

     @Override 
     public CharSequence getCompleteHandler(Component cmpnt) { 
      return ""; 
     } 
    }); 
} 
+0

謝謝,但我必須承認,我忘了說和標記它關於Wicket 1。5,它沒有那些在第6版中引入的AjaxRequestAttributes。但是,多虧了你,我在1.5中找到了類似的東西:AjaxCallDecorator,並且我在上面完全一樣(在純JS中),就像我想的那樣。我會很快發佈答案與解決方案的wicket 1.5。再次感謝! – Horuss

1

由於@Robert Niestroj答案(但只能在最新的檢票6個工作),我找到了解決方案檢票1.5,我希望這會幫助別人。

它只是類似的想法,但覆蓋getAjaxCallDecorator爲AjaxButton,並使用純JavaScript

實現
AjaxButton button1 = new AjaxButton("submit1") { 
    String id = this.getMarkupId(); 
    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form form) { 
     ... 
    } 

    @Override 
    protected org.apache.wicket.ajax.IAjaxCallDecorator getAjaxCallDecorator() { 
     return new AjaxCallDecorator() { 
      @Override 
      public CharSequence decorateScript(Component component, CharSequence script) { 
       return "document.getElementById(\'"+id+"\').style.display = 'none';"+script; 
      } 
     }; 
    } 
}; 

要記住重要的一點是要確保你正在返回腳本+讓您的腳本],否則你的onsubmit行動不會發生。

更多信息(也onSucces和onFailure處的版本)中Wicket 1.5 doc