何のためにXMLを吐き出しますか?おそらくモデルやビューを更新するためですよね?
Wicketの強みは、レンダリングされたHTMLについて心配する必要がないことです。Model-View-Controllerの用語では、モデルを正しく変更するようにControllerを設定し、Wicketがビューを処理します。
分離は完全には明確ではありません。実際、ビューコンポーネントを表示/非表示にしたり、変更したりすることができます。これは、ビューを変更していると見なすことができます。
しかし、一般的に行う必要がないのは、ブラウザまたはjavascriptを直接管理することです。Javaコードに変更を加える場合は、Wicketがそれを処理します。
Wicketでは、AjaxはAjaxRequestTargetターゲットを使用してAjaxBehaviorのメソッドを呼び出します。
そのメソッド(またはそこから呼び出されるメソッド)では、必要なことをすべて実行し、モデルまたはビューを更新してから、変更されたビューコンポーネントをターゲットに追加します。Wicketがブラウザの更新を処理します。
これが例です。これは私が行ったいくつかのコードから取られていますが、説明を明確にするために大幅に変更されています。考え方は単純です。一連の[State][County][District]のように、親の選択オプションが変更されると、子のオプションが変更される「連鎖」ドロップダウン選択です。
(実際のクラスでは、モデルの変更は子に渡されます。子は、変更されているかどうかを自動的に判断し、変更されている場合はターゲットに追加してから、ターゲットを子に渡します。そのほとんどを削除しました。より明確な例を作成してください。)
これがctorで、AjaxBehaviorの匿名サブクラスを追加するだけです。
public AjaxChildNotifyingDropDownChoice(...code elided for clarity...) {
this.child = child;
// Ajax won't work without this:
setOutputMarkupId(true);
//
add( new OnChangeAjaxBehavior() {
@Override
public void onUpdate(final AjaxRequestTarget target) {
// tell child to update its list
// based on newly selected value
// when the Ajax is called,
// my owning component's model
// is already updated
// note we could just type getModel()
// I'm making explicit that we're calling it
// on the enclosing class
// (which a non-static inner class has a hidden ref to)
child.setNewModelBasedOnSelectionOf(
AjaxChildNotifyingDropDownChoice.this.getModel());
// now add the child to the target
// Wicket javascript will receive the new
// options and re-render the child dropdown
target.add(child);
}
});
}
また、非表示または非表示のコンポーネントを使用したり、CSSスタイルなどの動作を追加したり、あるパネルを別のパネルに交換したりすることもできます。変更された各コンポーネントについては、次のようにします。1)setOutputMarkupId(true);を呼び出します。javascriptがそれを見つけることができるように、そして2)それをAjaxRequestTargetに追加しました
Ajaxビヘイビアーのタイプ(サブクラス)が異なればコールバック関数も異なることに注意してください。正しいものをオーバーライドしていることを確認してください(名前を間違えた場合にコンパイラーが文句を言うことができるように@Overrideアノテーションを追加してください)。
しかし、繰り返しになりますが、基本的なウィケットの考え方は、クライアントが解析して処理するための生データを送信する代わりに、モデルとビューを更新し、変更されたコンポーネントをに追加することで、変更したものを再レンダリングするようにWicketに指示することです。目標。
ストレートXMLを送信することを考えることができる唯一の理由は、それをWicket以外のJavaScriptにフィードすることです。それがあなたの目的であるかどうか私に知らせてください、そして私は完全に要点を逃しました。;)