2

多くの TextFields を持つフォームを含むコンポーネントがあります。それが機能する方法は、変更されたときに値がすぐに永続化されることです(すべてAJAXを介して[保存]ボタンはありません)。

AJAX 呼び出しは正常に機能し、値がモデルに取得されます。

モデル (および含まれるエンティティ) を保存するコードは、親コンポーネントにあります。onModelChanged() をオーバーライドして、コンポーネントから親に変更を伝達すると考えました。しかし、 onModelChanged() は呼び出されません。

親には、クラス メンバー フィールドとして独自のモデルがあります。サブコンポーネントはこれを使用します:

ReleaseTraitRowPanel( String id, IModel<IHasTraits> relModel, ... ) {
    ...
    PropertyModel<String> traitModel = new PropertyModel( relModel.getObject().getTraits(), prop);

    EditableLink4 link = new EditableLink4("link", traitModel){
        // Pass the change notification to upper level. TODO: Does Wicket do this automatically?
        @Override protected void onModelChanged() {
            ReleaseTraitRowPanel.this.onModelChanged();
        }
    };
    ...

}

それはどのように行われるべきですか?onModelChanged() を渡す必要がありますか? それとも、ウィケットには他のモデルに変更を通知する方法がありますか?

関連 - CompoundPropertyModel はフォーム専用ですか、それとも任意のコンポーネントで使用できますか? ここで使用できます - propid と同じです。

4

2 に答える 2

1

解決しました。問題は、常に失敗する Validator がありonModelChanged()、検証が成功した後に呼び出されることでした。また、フィードバック パネルに追加されなかったため、検証エラー メッセージがフィードバック パネルに到達しませんでしたAjaxRequestTarget...

これがすべて完了したら、osdamv の回答も適用されます。そのことについてブログ記事を書きました。 https://community.jboss.org/people/ozizka/blog/2013/01/21/wicket-creating-ajax-enabled-entity-based-pages

于 2013-01-22T02:18:17.577 に答える
1

間違ったメソッドを使用しています。modelChanged() を使用する必要があります。彼のソース コードが次のようになっている場合は、

/**
 * Called to indicate that the model content for this component has been changed
 */
public final void modelChanged()
{
    // Call user code
    internalOnModelChanged();
    onModelChanged();
}

一方、 onModelChanged() は

/**
 * Called anytime a model is changed after the change has occurred
 */
protected void onModelChanged()
{
}

ご覧のとおり、onModelChanged() は modelChanged() の呼び出しです。

CompoundPropertyModel は任意の WebMarkUpContainer で使用できます。つまり、ほぼすべてのコンテナで

于 2013-01-22T00:07:16.537 に答える