0

最近ウィケットを使い始めました。あなたのプロジェクトの例で、本「Apache wicket by Vaynberg」の「リンクされた選択ボックス」を使用しようとしました。

本から例を再作成しました:

public class LinkedSelectboxesPage extends WebPage {

private Country country;
private City city;

public LinkedSelectboxesPage() {
    Database.buildData();
    country = Database.getCountries().get(0);

    FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
    add(feedbackPanel);

    Form form = new Form("form");
    add(form);

    DropDownChoice<Country> countries = new DropDownChoice<Country>(
            "countries",
            new PropertyModel<Country>(this, "country"),
            new CountriesModel(),
            new ChoiceRenderer<Country>("name", "code")) {
        protected boolean
        wantOnSelectionChangedNotifications() {
            return true;
        }

        protected void
        onSelectionChanged(Country newSelection) {
            city = null;
        }
    };
    countries.setRequired(true);
    form.add(countries);

    DropDownChoice<City> cities = new DropDownChoice<City>(
            "cities",
            new PropertyModel<City>(this, "city"),
            new CitiesModel(),
            new ChoiceRenderer<City>("name", "code"));
    cities.setRequired(true);
    form.add(cities);
}

private static class CountriesModel extends LoadableDetachableModel<List<? extends Country>> {
    protected List<? extends Country> load() {
        return Database.getCountries();
    }
}

private class CitiesModel extends LoadableDetachableModel<List<? extends City>> {
    protected List<? extends City> load() {
        return Database.getCities(country.getCode());
    }
}
}

プロジェクトでリンクされた選択ボックスを使用しようとすると、関数本体の前に固定されているブレークポイントが達成されません。

public class AddArticlePanel extends Panel {

private Type type;
private Subtype subtype;

private List<Type> typesList;
private List<Subtype> subtypesList;

@SpringBean
@SuppressWarnings("unused")
public static ITypeDao typeDao;

@SpringBean
@SuppressWarnings("unused")
private ISubtypeDao subtypeDao;

public AddArticlePanel(String id) {
    super(id);

    this.typesList = typeDao.loadAllTypes();
    this.type = this.typesList.get(0);

    Form form = new Form("form");
    add(form);

    FormComponent<String> tbTitleArticle = new TextField<String>("titleArticle").setRequired(true);
    form.add(tbTitleArticle);

    FormComponent<String> taTextArticle = new TextArea<String>("textArticle").setRequired(true);
    form.add(taTextArticle);

    DropDownChoice<Type> ddcTypes = new DropDownChoice<Type>(
            "typeArticle",
            new PropertyModel<Type>(this, "type"),
            new TypesModel(),
            new ChoiceRenderer<Type>("name", "id")) {

        protected boolean wantOnSelectionChangedNotifications() {
            return true;
        }

        protected void onSelectionChanged(Type newSelection) {
            type = null;
        }
    };
    ddcTypes.setRequired(true);
    form.add(ddcTypes);

    DropDownChoice<Subtype> ddcSubtypes = new DropDownChoice<Subtype>(
            "subtypeArticle",
            new PropertyModel<Subtype>(this, "subtype"),
            new SubtypesModel(),
            new ChoiceRenderer<Subtype>("name", "id"));
    ddcSubtypes.setRequired(true);
    form.add(ddcSubtypes);
}

public AddArticlePanel(String id, IModel<?> model) {
    super(id, model);
}

private static class TypesModel extends LoadableDetachableModel<List<? extends Type>> {
    protected List<? extends Type> load() {
        return typeDao.loadAllTypes();
    }
}

private class SubtypesModel extends LoadableDetachableModel<List<? extends Subtype>> {
    protected List<? extends Subtype> load() {
        return subtypeDao.loadSubtypesByTypeId(type.getId());
    }
}
}

なぜそれが起こったのか理解できません。助けてください、私の英語でごめんなさい。

4

3 に答える 3

1

私の解決策はAjaxを使用することです:

ddcTypes.add(new AjaxFormComponentUpdatingBehavior("onchange")
{
    @Override
    protected void onUpdate(AjaxRequestTarget target)
    {
        target.add(ddcSubtypes);
    }
});

しかし、なぜ以前はパネルが機能しなかったのか(Ajaxなしで)理解したい...

???? !!!!!!!

于 2012-07-11T14:26:56.863 に答える
1

onSelectionChanged メソッドで、タイプを null に設定します。これは、countries-ddc onSelectionChanged メソッドが都市変数をリセットする本の例とは対照的に、必要な DropDownChoice フィールド ddcTypes のモデルをサポートするメンバーです。

あなたの場合、タイプへのすべての変更をnullにリセットするため、フォームが無効になり、有用なことを行うことができなくなります。

于 2012-07-10T08:04:51.403 に答える
0

私はすでに改札1.5.7を使用しています。

AddArticlePageクラスでAddArticlePanelクラスを使用します

public class AddArticlePage extends AbstractBasePage {
    public AddArticlePage() {
        add(new HeaderPanel("header"));
        add(new MenuPanel("menu"));
        add(new AddArticlePanel("body")); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        add(new FooterPanel("footer"));
    }
}

およびクラスBlogApplicationで使用されるクラスAddArticlePage:

public class BlogApplication extends WebApplication {

    @Override
    public void init() {
        this.getComponentInstantiationListeners().add(new SpringComponentInjector(this));
        Injector.get().inject(AddArticlePanel.class);

        mountPage("/add-article/", AddArticlePage.class);
    }

    @Override
    public Class<? extends Page> getHomePage() {
        return IndexPage.class;
    }
}

リンクされた選択ボックスでページを開くと、この構成は機能しません。ただし、クラスBlogApplicationを変更した場合->

public class BlogApplication extends WebApplication {

    @Override
    public void init() {
        this.getComponentInstantiationListeners().add(new SpringComponentInjector(this));
        Injector.get().inject(AddArticlePanel.class);

    }

    @Override
    public Class<? extends Page> getHomePage() {
        return AddArticlePage.class; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    }
}

それは魔法のように起こります-リンクされた選択ボックスはうまく機能します。WebApplication.mountPage(string、class)メソッドを使用する方法/時期/理由がよくわからなかったのかもしれません。

于 2012-07-10T17:39:30.953 に答える