0

ページの ListView と検証に問題があります。

ListView があり、その下にユーザーが値を入力できる TextField があります。ページに「公開」ボタンと「下書き保存」ボタンがあります。発行は、ユーザーが入力したデータを確認するためのポップアップ (ModalWindow) が表示されるボタンです。下書き保存は確認せずに保存しています。どちらも SecuredAjaxLink オブジェクトです。

ユーザーが TextField にデータを入力すると、ListView に保存されますが、ユーザーが下の [追加] ボタンを押す必要があるため、リスト全体は更新されません。これで結構です。

問題は、ユーザーが入力した情報がいくつかのルールでチェックされるビジネス検証があることです。検証が失敗すると、すべてのフィールド (間違った情報を含む) が css で強調表示されます。TextField から ListView に値を明示的に追加するには、私はやっています

target.addComponent(form);

これは、データが検証に進む前に実行されます。したがって、すべてのフィールドが更新されます。これは公開ボタン (確認用の ModalWindow) では問題なく機能しますが、ポップアップのないリンクでは機能しません。私が理解しているように、ターゲットのライフサイクルに何か問題がありますが、私はそれで立ち往生しています。

多分誰かが似たようなことをしたか、答えを知っていますか?

ポップアップを使用せずにページを更新するにはどうすればよいですか?

コードは次のとおりです: ドラフトリンク:

add(new SecuredAjaxSubmitLink(LinkNames.savelaterLink.toString(), form,
                RoleController.CONTROLLER.getAccessController()) {
            @Override
            public void onSubmit(AjaxRequestTarget target, Form form) {
                target.addComponent(form);
                insert(appl, false, form, target, new MainMenu(getString("accept.application.draft.success.message")), trail, checkbox);
            }

リンクを公開:

add(new CustomAjaxSubmitLink(LinkNames.submitLink.toString(), form,
                RoleController.CONTROLLER.getAccessController()) {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
                target.addComponent(form);
                publishPopup.show(target);
            }
        });

publishPopup.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
            public void onClose(AjaxRequestTarget target) {
                if (ApplicationInsertActionPanel.this.getSelectedAction() != null
                        && ApplicationInsertActionPanel.this.getSelectedAction().equals(Action.CONFIRM)) {
                    insert(appl,
                            true,
                            form,
                            target,
                            new MainMenu(ApplicationInsertActionPanel.this
                                    .getString("accept.application.publish.success.message")), trail, checkbox);
                }

            }
        });

私は追加しました

@Override
            protected void onError(final AjaxRequestTarget target, Form<?> form)
            {
                super.onError(target, form);
                target.addComponent(form);

下書きリンクに移動しましたが、まだページは完全には更新されていません。ポップアップウィンドウを使用しているときに終了するように、ターゲットのライフサイクルが終了していないためだと思います。ポップアップウィンドウが「新しいページ」を開き、古いターゲットを更新できますが、ポップアップを使用していないときは、ページはそのままです。だから今、ターゲットのライフサイクルを終了するための回避策を考えています。機能のない透明なポップアップ ウィンドウについて考えていましたが、実際には非常に汚いソリューションです。

何か案は?ありがとう!}

4

1 に答える 1

0

私の英語はあまり上手ではありません、そして私はあなたの投稿を完全に理解していません。それは:テキストフィールドに単語を入力->それらの送信ボタンの1つ->単語がリストビューに表示されますか?入力を検証したい場合は、から継承するクラスを使用しない理由IValidator.class

フォームを更新する場合は、フォームに更新動作を追加できます。

final AjaxFormSubmitBehavior            formbehavior    = new AjaxFormSubmitBehavior("onChange") {
    @Override
    protected void onError(AjaxRequestTarget arg0) {
        arg0.add(getForm());
    }

    @Override
    protected void onSubmit(AjaxRequestTarget arg0) {
        arg0.add(getForm());
    }
};

次に、この動作をフォームに追加したり、ニーズに合わせて拡張したりできます

form.add(formbehavior)

あなたの問題が私の答えに何らかの形で関連しているかどうかはわかりませんが、新しいページをロードせずにフォームを更新する方法を知りたいと思ったと思います。

于 2012-05-31T10:43:36.783 に答える