2016-11-23 81 views
1

我使用Wicket 6.xx,並且我有一個Wicket Form用於上傳一些文件。這不是問題。問題是我需要在提交表單後在頁面上運行一些JavaScript,以顯示基於JavaScript的模式彈出窗口。Wicket:提交表單時運行JavaScript

但是,我不能這樣做,因爲我沒有AjaxRequestTarget對象,因爲表單提交不是Ajax調用。或者至少,我猜這就是原因。我試過以下,從另一個線程拍攝,但它不工作:

From<RequestInfo> uploadFrm = new Form<RequestInfo>("uploadFrm", getModel()) { 
    private static final long serialVersionUID = 1L; 

    @Override 
    protected void onSubmit() { 
     AjaxRequestTarget target = RequestCycle.get().find(AjaxRequestTarget.class); 
     target.appendJavascript("..."); //NullPointerException: target is always null 
    } 
}; 

你可以從我把那裏評論說,target總是null

在這種情況下運行一些JavaScript的正確方法是什麼?有沒有合適的方法?

回答

3

我想做到這一點的最好辦法是一個AjaxSubmitLink添加到您的形式,所以你可以調用的onsubmit方法中的JavaScript代碼:

HTML代碼:

<form wicket:id="uploadFrm"> 
    <input type="submit" wicket:id="ajaxSubmitLink" value="OK" /> 
</form> 

Java代碼:

From<RequestInfo> uploadFrm = new Form<RequestInfo>("uploadFrm", getModel()); 
AjaxSubmitLink ajaxSubmitLink = new AjaxSubmitLink("ajaxSubmitLink", uploadFrm) { 
      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form<?> form) { 
       target.appendJavaScript("you javascript");       
      } 

     }; 

     uploadFrm.add(ajaxSubmitLink); 
4

如果你不想像m.bouali的答案那樣去完整的Ajax,你可以使用一個臨時的行爲來代替:

@Override 
protected void onSubmit() { 
    add(new Behavior() { 
     protected boolean isTemporary(Component component) { 
      // this behavior will be removed after rendering 
      return true; 
     } 

     public void renderHead(Component component, IHeaderResponse response) { 
      response.render(JavaScritpHeaderItem.forScript("...")); 
     } 
    }); 
}); 
+0

我曾嘗試過這種解決方案,但不知道是否覆蓋「isTemporary」,我無法找到如何在渲染後將其刪除。感謝您的信息,最終與ajax解決方案一起使用,但這是一個很好的選擇,+1 –