2

入力/ラベルと表示を変更するメソッド (必須、有効など) を含む wicket コンポーネントを作成しました。コンポーネントは正常にレンダリングされますが、フォームが送信されると、フォーム パラメータ 'input' が 1 つだけ表示され、それが最後の InputRow コンポーネントになります。

InputRow.html

<html xmlns:wicket="http://wicket.apache.org">
<head>
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
    <wicket:panel>
        <label wicket:id="label">abc: <span class="req">*</span></label>
        <span class="input">
            <input wicket:id="input" type="text" id="name"></input>
        </span>
        <span wicket:id="input_feedback"></span>            
    </wicket:panel>

</body>
</html>

入力行.java

package com.wicket;

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;

public class InputRow extends Panel{

    @SuppressWarnings("unused")
    private String id;

    public InputRow(String id, String label) {
        super(id);

        this.id = id;

         Label memberIdLabel = new Label("label",label);
         memberIdLabel.setEscapeModelStrings(false)
            .add(new AttributeAppender("for", new Model<String>(id),""));
         add(memberIdLabel);

        TextField<String> name = new TextField<String>("input");
        name.setType(String.class)
            .setMarkupId(id)
            .setOutputMarkupId(true);
        add(name);

        add(new Label("input_feedback",""));

    }

    public InputRow disable()
    {
        get("input")
            .setEnabled(false)
            .add(new AttributeAppender("class", new Model<String>("disabled"),""));
        get("label")
            .add(new AttributeAppender("class", new Model<String>("disabled"),""));
        return this;
    }

    public InputRow required()
    {
        Model model = (Model)get("label").getInnermostModel();
        StringBuffer label = new StringBuffer((String)model.getObject());
        label.append(" <span class=\"req\">*</span>");
        model.setObject(label);

        ((TextField)get("input")).setRequired(true);
        return this;
    }

    @Override
    protected void onBeforeRender() {
        super.onBeforeRender();
        Label feedback = (Label)get("input_feedback");

        if (get("input").getFeedbackMessage() != null)
        {
            feedback.setDefaultModel(new Model<String>("Required"));
        }
    }


}

フォーム コンポーネントへの追加

add(new InputRow("name","Name:").required());

編集 ビルド時にフォームに追加する行/フィールドがわかっているため、ListView またはリピーターを設定しませんでした。

4

3 に答える 3

1

InputFieldsにモデルがありません。このように、wicketはformdataをどこに保存するかを知りません。フィールドにモデルを追加すると、モデルは自動的に入力されます。

于 2012-08-25T11:35:16.433 に答える
1

送信されるフォーム パラメータは 1 つだけではありません。送信は、name:inputname2:input、 ...のような名前です。

ただし、Nicktar がコメントで示唆しているように、モデルを使用してフォーム コンポーネントの値をエンティティ オブジェクトにバインドする必要があります。コンストラクターでを受け入れ、IModelのコンストラクターで使用する必要がありTextFieldます。

あなたがやろうとしていることへのより良いアプローチはBehavior、FormComponent の装飾マークアップを追加する を書くことです。そうすれば、単純なテキスト入力フィールド以上に機能し、 のインスタンスを完全にカスタマイズできますFormComponents

次のようになります。

public class FormComponentBehavior extends Behavior {

    @Override
    public void bind(Component component) {
        if (!(component instanceof FormComponent)) {
            throw new IllegalArgumentException();
        }
    }

    @Override
    public void beforeRender(Component component) {
        FormComponent<?> fc = (FormComponent<?>) component;
        Response r = component.getResponse();
        r.write("<label" + (fc.isRequired() ? " class='required'" : "") + ">");
        r.write(fc.getLabel().getObject());
        r.write("</label>");
        r.write("<span class='input'>");
    }

    @Override
    public void afterRender(Component component) {
        component.getResponse().write("</span>");
        // if feedback errors write them to markup...
    }
}

次に、この動作を FormComponent インスタンスに追加する必要があります。

于 2012-08-24T14:50:22.583 に答える
0

おそらく、フォームの問題は、入力テキスト フィールドの ID がすべて同じであることです。「id」の代わりに属性「name」を使用してみてください

于 2012-08-24T14:59:13.237 に答える