0

Wicketで書いている動的フォームがあり、「ここをクリックして問題を追加」タイプのボタンで複製されるフォームがいくつかあります。私は非常に基本的な(まだWicketを初めて使用する)AJAXyリスナーを作成しましたが、ほとんど機能しますが、ListView内のアイテムを削除または非表示にする方法がわかりません。

これは私に不思議に思います、いくつかのJSにフォームフィールドを複製させる方法はありますか?Wicketコンポーネントを使用してフォームを再構築する前に、Jquery DynamicFormPluginで値を複製していました。これはうまく機能し、非常に理解しやすかった(重要なプラス)。ただし、次のようなプラグインの代わりにプラグインを使用した場合、これがWicketにどのように影響するかを理解できません。

    //Issue box magic
    final MarkupContainer rowPanel = new WebMarkupContainer("issuesPanel");
    rowPanel.setOutputMarkupId(true);
    form.add(rowPanel);
    ArrayList numIssues = new ArrayList();
    numIssues.add(new Object());
    numIssues.add(new Object());
    numIssues.add(new Object());
    final ListView lv = new ListView("issuesBox", numIssues) {
        @Override
        protected void populateItem(ListItem item) {
            int index = item.getIndex() + 1;

            item.add(new DropDownChoice("issues", combinedIssues));
            item.add(new TextField<String>("note"));
        }
    };
    lv.setReuseItems(true);
    rowPanel.add(lv);
    form.add(new AjaxSubmitLink("addIssue", form) {
        @Override
        public void onSubmit(AjaxRequestTarget target, Form form) {
            lv.getModelObject().add(new Object());
            if (target != null)
                target.add(rowPanel);
        }
    }.setDefaultFormProcessing(false));
    form.add(new AjaxSubmitLink("removeIssue", form) {
        @Override
        public void onSubmit(AjaxRequestTarget target, Form form) {
            //Wicket gets very angry when you remove components, so just hide it (recommended way)
            if (target != null) {
                Component lastObject = (Component)lv.get(lv.getList().size() - 1);
                lastObject.setVisible(false);
                log.debug("Components " + lv.get );
            }

        }
    }.setDefaultFormProcessing(false));

JQueryプラグインの方がはるかに使いやすいですが、Wicketに、思っていたよりも多くのフィールドがあることをどのように伝えることができますか?

また、アプリを使用しているシルトで問題になる可能性のある新しい問題を追加するためだけに、AJAX呼び出しを回避しようとしていることに注意してください。

助言がありますか?

4

2 に答える 2

3

ajaxを介してhtmlにフォーム要素を追加することはできません。Wicketを使用すると、htmlとJavaのコンピテントツリーがあり、両方が一致する必要があります。最終的に、Wicketは、フォームを送信するときに値をどう処理するかを知っている必要があります。

あなたの特定の要件を理解しているのかわかりませんが、同様の問題は、人に住所を追加することの問題かもしれないと思います。ここでは、1つの住所に必要なすべてのフィールドを含むフォームを含むAdressEditPanelを作成します。そのパネルには、モデルとしてPersonAdress(例として)オブジェクトがあります。

Personには、住所のコレクションがあり、ListViewを使用して各住所をレンダリングおよび編集します。ListViewのpopulateItem()関数で、AdressEditPanelの1つのインスタンスをアイテムに追加します。

人に住所を追加する必要がある場合は、住所のコレクションにエントリを追加してフォームを再表示します(最初に、Ajaxを使用せずに作業し、機能したら、ajaxに切り替えるために必要な最小限の変更を行います)。

お役に立てば幸い

于 2012-09-11T19:08:53.660 に答える
0

モデルオブジェクトを変更した後でListViewでremoveAll()を呼び出すと、問題が解決するはずです。例えば

new AjaxSubmitLink("addIssue", form) {
        @Override
        public void onSubmit(AjaxRequestTarget target, Form form) {
            lv.getModelObject().add(new Object());
            lv.removeAll();
            if (target != null)
                target.add(rowPanel);
        }

ただし、これが検証の形成に問題を引き起こす可能性があるかどうかはわかりませんが、安全であると思います。

アップデート

リンクを削除するために同じ手法を適用する場合は、次のように記述します。

new AjaxSubmitLink("removeIssue", form) {
        @Override
        public void onSubmit(AjaxRequestTarget target, Form form) {

            if (target != null) {
                lv.getModelObject().remove(lv.getList().size() - 1);
                lv.removeAll();
                target.add(rowPanel);

            }

        }
    }

ただし、AJAXがないとこれは不可能です。唯一の方法はJSを使用し、サーバー側でフォームからのリクエストパラメータを読み取ることです。

于 2012-09-11T18:29:06.207 に答える