Я пытаюсь реализовать обратный вызов jQuery AJAX для получения события сторонней библиотеки JavaScript.
И это почти срабатывает! :)
Сообщение jQuery AJAX является получателем на стороне сервера. URL-адрес обратного вызова генерируется AbstractDefaultAjaxBehavior, который был добавлен в Panel. В ответном методе Поведения я добавил дочерний компонент Panel к AjaxRequestTarget. Но это не перерисовывает компонент. Никакое исключение не выбрасывается, устанавливается выход oft markupId.
Есть идеи? Любая идея, где я могу найти компонент калитки, делающий что-то подобное в GitHub и т.д.
Мое решение основано на комментариях выше. Простая метка для обновления через AjaxCallback:
public class HomePage extends WebPage { private static final long serialVersionUID = 1L; private String value = "Hello World"; public HomePage(final PageParameters parameters) { super(parameters); final Label label = new Label("label", new PropertyModel(HomePage.this, "value")); label.setOutputMarkupId(true); add(label); label.add(new DemoCallback(){ @Override protected void onCallback(String fromClient, AjaxRequestTarget target) { value = fromClient; target.add(label); } }); } }
Поведение, которое выполняет обратный вызов:
public class DemoCallback extends AbstractDefaultAjaxBehavior { @Override public void renderHead(Component component, IHeaderResponse response) { super.renderHead(component, response); StringBuffer script = new StringBuffer(); script.append("alert('Callback will follow!');\n"); script.append("var dataForServer='From client with love.';\n"); script.append(getCallbackFunctionBody(CallbackParameter .explicit("dataForServer"))); response.render(OnEventHeaderItem.forScript( "'" + component.getMarkupId() + "'", "click", script.toString())); } @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); attributes.setMethod(Method.POST); } @Override protected void respond(AjaxRequestTarget target) { StringValue parameterValue = RequestCycle.get().getRequest() .getPostParameters().getParameterValue("dataForServer"); onCallback(parameterValue.toString(), target); } protected void onCallback(String fromClient, AjaxRequestTarget target) { // overide to handle callback } }
Какая калитка делает в главном разделе:
Wicket.Event.add('label1', "click", function(event) { alert('Callback will follow!'); var dataForServer='From client with love.'; var attrs = {"u":"./?0-2.IBehaviorListener.0-label","c":"label1","m":"POST"}; var params = {'dataForServer': dataForServer}; attrs.ep = params; Wicket.Ajax.ajax(attrs); ;});
AjaxTabbedPanel
- один из примеров расширений wicket. Если этого не произойдет, пожалуйста, опубликуйте свой код обработчика и создание соответствующей иерархии компонентов.