1

wicket 6.5 でいくつかの AJAX DropDown をテストしたかった (wicket 6.6 を試してみたが、同じ問題があった)。

クイックスタートウィケットページを使用してウィケットテストプロジェクトを作成しました - http://wicket.apache.org/start/quickstart.html

mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=6.6.0 -DgroupId=net.betlista -DartifactId=tests.wicket-6.6 -DarchetypeRepository= https://repository.apache .org/ -DinteractiveMode=false

生成されたクラスに変更HomaPageしました。LoadableDropDownTestPagegetHomePage()WicketApplication

LoadableDropDownTestPage の Java コードは次のとおりです。

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

次の問題は、country 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. ***
********************************************************************
4

2 に答える 2

5

<body>問題は、HTML でタグを使用していないことだと思います。これにより HTML パーサーが壊れます。これが、AJAX デバッグ ウィンドウ (およびその他の JavaScript の動作) が表示されない理由です。

Wicket Examples であなたがしようとしていることの良い例があります。それを見てください: http://www.wicket-library.com/wicket-examples/ajax/choice

于 2013-03-20T00:55:33.060 に答える
0

AjaxFormComponentUpdatingBehaviour代わりに使用してみてください。以下は、動作する私のコードのセクションです -

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

  @Override
  protected void onUpdate(AjaxRequestTarget target) {
    ...
  }
});
于 2013-03-19T18:05:20.650 に答える