2013-03-19 3 views
1

Я хотел протестировать AJAX DropDown в калитки 6.5 (пробовал калитки 6.6 и имел те же проблемы).Ajax не работает в калитке для меня

Я создал тестовый проект калитки с помощью быстрого старта калитки страницы - http://wicket.apache.org/start/quickstart.html

МВНА архетип: генерировать -DarchetypeGroupId = org.apache.wicket -DarchetypeArtifactId = калитка-архетипа-быстрый старт -DarchetypeVersion = 6.6.0 -DgroupId = net.betlista -DartifactId = tests.wicket-6,6 -DarchetypeRepository = https://repository.apache.org/ -DinteractiveMode = ложная

Я изменил HomaPage к моему LoadableDropDownTestPage в getHomePage() генерируемого WicketApplication с деваха.

код Java для LoadableDropDownTestPage является:

package net.betlista; 

import java.io.Serializable; 
import java.util.Arrays; 
import java.util.LinkedList; 
import java.util.List; 

import org.apache.wicket.ajax.AjaxRequestTarget; 
import org.apache.wicket.ajax.IAjaxIndicatorAware; 
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; 
import org.apache.wicket.ajax.markup.html.form.AjaxButton; 
import org.apache.wicket.markup.html.WebPage; 
import org.apache.wicket.markup.html.form.DropDownChoice; 
import org.apache.wicket.markup.html.form.Form; 
import org.apache.wicket.markup.html.panel.FeedbackPanel; 
import org.apache.wicket.model.IModel; 
import org.apache.wicket.model.LoadableDetachableModel; 
import org.apache.wicket.model.Model; 
import org.apache.wicket.model.PropertyModel; 

public class LoadableDropDownTestPage extends WebPage implements IAjaxIndicatorAware { 

    public LoadableDropDownTestPage() { 
     addComponents(); 
    } 

    private void addComponents() { 
     add(new FeedbackPanel("feedback")); 

     FormObject formObject = new FormObject(); 
     Form<FormObject> form = new Form<FormObject>("loadableDropDownTestForm", Model.of(formObject)); 
     form.setOutputMarkupId(true); 
     form.setOutputMarkupPlaceholderTag(true); 

     final DropDownChoice<String> countryDD = new LoadableDropDown("countryDD", new PropertyModel<String>(formObject, "country")); 
     countryDD.setChoices(new CountryLoadableModel()); 
     countryDD.setOutputMarkupId(true); 
     countryDD.setRequired(true); 
     countryDD.setOutputMarkupPlaceholderTag(true); 

     final DropDownChoice<String> cityDD = new LoadableDropDown("cityDD", new PropertyModel<String>(formObject, "city")); 
     cityDD.setChoices(new CityLoadableModel()); 
     cityDD.setOutputMarkupId(true); 
     cityDD.setRequired(true); 
     cityDD.setOutputMarkupPlaceholderTag(true); 

     countryDD.add(new OnChangeAjaxBehavior() { 
      @Override 
      protected void onUpdate(AjaxRequestTarget target) { 
       System.out.println("country DD changed"); 
       target.add(cityDD); 
      } 
     }); 

     form.add(countryDD); 
     form.add(cityDD); 

     form.add(new AjaxButton("ab") {}); 

     add(form); 
    } 

    static class LoadableDropDown extends DropDownChoice<String> { 

     public LoadableDropDown(String id, IModel<String> model) { 
      super(id); 
      setModel(model); 
     } 

    } 

    static class FormObject implements Serializable { 
     String country; 
     String city; 
    } 

    class CountryLoadableModel extends LoadableDetachableModel<List<String>> { 

     @Override 
     protected List<String> load() { 
      System.out.println("loading CountryLoadableModel"); 
      List<String> result = Arrays.asList(new String[] { "CR", "SR" }); 
      return result; 
     } 

    } 

    class CityLoadableModel extends LoadableDetachableModel<List<String>> { 

     List<String> choices = new LinkedList<String>(); 

     @Override 
     protected List<String> load() { 
      System.out.println("loading CityLoadableModel"); 
      if (choices.isEmpty()) { 
       choices.add("1"); 
      } else { 
       int size = choices.size(); 
       choices.add(Integer.toString(size+1)); 
      } 

      return choices; 
     } 

    } 

    @Override 
    public String getAjaxIndicatorMarkupId() { 
     return "ajaxIndicator"; 
    } 

} 

и HTML для страницы:

<!DOCTYPE html> 
<html xmlns:wicket="http://wicket.apache.org"> 

    <div wicket:id="feedback"></div> 

    <form wicket:id="loadableDropDownTestForm"> 
     Countries: <select wicket:id="countryDD"></select><br> 
     Cities: <select wicket:id="cityDD"></select><br> 
     <!-- input type="submit"--> 
     <button wicket:id="ab"></button> 
    </form> 


</html> 

Моя самая первая проблема в том, что я не мог видеть AJAX отладки ссылку на моей странице. Но я думаю, что пока есть OnChangeAjaxBehavior, я должен это увидеть.

Следующая проблема заключается в том, что когда я изменяю значение в стране DropDown, ничего не происходит, и я понятия не имею, что я делаю неправильно.

В моем коде вы можете видеть, что я также пытался использовать AjaxButton, но это тоже не сработало.

редактировать:

часть журнала (он работает в режиме DEV)

******************************************************************** 
*** WARNING: Wicket is running in DEVELOPMENT mode.    *** 
***        ^^^^^^^^^^^     *** 
*** Do NOT deploy to your live server(s) without changing this. *** 
*** See Application#getConfigurationType() for more information. *** 
******************************************************************** 
+0

Аякса Debug Окно появляется только в режиме DEV. Проверьте наличие ошибок - как в консоли JS, так и в журналах сервера. Проверьте, выполняется ли вызов Ajax с помощью Firebug/Dev Tools. Ваш код не оптимален, но я не вижу ошибок. –

+0

Спасибо за подсказку, но, согласно журналу, он работает в режиме DEV ... Я также попробую Firebug. – Betlista

+0

Я не вижу никакого вызова AJAX в firebug: -/ – Betlista

ответ

5

Я думаю, что проблема заключается в том, что вы не используете <body> тег в HTML. Это разрывает HTML-синтаксические анализаторы, и поэтому вы не можете увидеть окно отладки AJAX (и любое другое поведение JavaScript).

Существует хороший пример того, что вы пытаетесь сделать в Калитки примерах, посмотрите на него: http://www.wicket-library.com/wicket-examples/ajax/choice

+0

Действительно, в этом была проблема, спасибо ;-) Я видел эту страницу раньше, но ссылка на исходный код не работает: -/ – Betlista

+0

К сожалению, этот код подходит для Eclipse: - / – Betlista

0

Попробуйте использовать AjaxFormComponentUpdatingBehaviour вместо этого. Далее раздел из моего кода, который работает -

DropDownChoice<String> actionSelect = new DropDownChoice<String>("myDropdown", updateActions, choiceRenderer); 
actionSelect.add(new AjaxFormComponentUpdatingBehavior("onchange") { 

    @Override 
    protected void onUpdate(AjaxRequestTarget target) { 
    ... 
    } 
}); 
+0

и есть ли разница в этих двух поведениях? – Betlista

+0

Пробовал, и он тоже не работает ... – Betlista

+0

Похоже, не очень много. AjaxFormComponentUpdatingBehaviour является суперклассом OnChangeAjaxBehaviour –

Смежные вопросы