0

Apache Wicket を使用してフォームを作成中です。同じページ/クラスを使用して、データベースに新しいアイテムを追加し、データベース内の既存のレコードを編集します。もちろん、ページ コンストラクターは 1 回だけ呼び出されるため、モデルはページに最初に読み込まれたレコード、または既存のレコードを編集していない場合は新しいレコードに常に設定されます。

データを動的にロードする方法をいくつか見つけましたが、それらは冗長で少しぎこちないようです。このようなシナリオを処理するためのベスト プラクティスがあると思います。

参考までに、編集したコードを次に示します。

public class JobManagement extends WebPage {

private static final long serialVersionUID = 1L;
private long jobId = 0;

protected void setJobId(long id) {
    this.jobId = id;
}

protected long getJobId() {
    return jobId;
}

public JobManagement() {
    LoadableDetachableModel<Job> jobModel = new LoadableDetachableModel<Job>() {

        private static final long serialVersionUID = 1L;

        @Override
        protected Job load() {
            Job job = (Job) EntityFactory.getInstance().getBean("job");

            // if we're editing an existing job, load the object
            if (jobId >= 1) {
                job.load(jobId);
            }

            return job;
        }

    };

    add(new FeedbackPanel("feedbackPanel"));

    Form<Job> jobForm = new Form<Job>("jobForm") {

        private static final long serialVersionUID = 1L;

        @Override
        public void onSubmit() {
            // Handles the form submit...

        }

    };

    add(jobForm);

    jobForm.setModel(new CompoundPropertyModel<Job>(jobModel));
    // SNIP ... All my form fields go here!
    jobForm.add(new Button("submit"));

}

}

私は LoadableDetachableModel を使用していますが、ページがレンダリングされるたびに動的にロードを処理する方法が完全に明確ではありません。モデルの新しいインスタンスをロードしようとしましたが、私の LoadableDetachableModel を返す getObject() クラスをオーバーライドしましたが、それについて非常に間違っていると感じることがあります。任意の入力をいただければ幸いです。私はこのフレームワークについて、オンライン ドキュメントだけで自分のやり方を感じようとしてきました。

4

2 に答える 2

0

リンクメソッド(前の回答)は問題を引き起こす可能性があり、リンクの実装方法によっては問題が発生することがよくありますが、この場合の実際の問題は、ドメインオブジェクトのインスタンスをロードするために使用されていた「EntityFactory」にありました。この場合、新しいインスタンスをインスタンス化する代わりに、キャッシュされたデータを提供していました。

要約すると、フォームを2回参照したときに、フォームのモデルオブジェクトがリセットされていないように見える、このような場合の評価事項は次のとおりです。

1-ページにアクセスするために使用しているリンク戦略

2-ドメインオブジェクトをフォーム上のモデルにロードしてバインドするために使用しているメソッド

于 2013-02-19T19:28:23.767 に答える
0

私自身の質問に答えるために、私が経験していた問題は、ページに戻るたびに、フォームにバインドされたモデルが持続しているように見えることでした. これにより、問題はモデルの管理方法にあると思いましたが、実際の問題はページへのリンク方法に関連していました。

上記のページは、次のようにリンクされていました。

Link<String> link = new BookmarkablePageLink<String>("addLink", MyAddClass.class);

場合によってはこれが許容されるアプローチですが、この特定のケースでは正しいアプローチではありません。何が起こるべきだったかは次のとおりです。

Link<String> link = new Link<String>("addLink") {
    public void onClick() {
        setResponsePage(new MyAddClass());
    }
}

この方法でリンクが動的に処理されると、アプリケーションは意図したとおりに動作します。リンクに関するこの根本的な問題に目を向けさせてくれたすべての人に感謝します。

于 2013-02-18T21:47:14.817 に答える