2016-11-23 5 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 метода:

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

Если вы не хотите идти полный Ajax, как в ответе m.bouali, вы можете использовать временное поведение вместо:

@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 –