2016-11-23 77 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 –