4

JavascriptコンポーネントにウィジェットをラップしていWicketます。JS側にコンポーネントと話させたい。私がこれまでに持っているもの:

問題のコンポーネントは次のようになります

talker = new GridAjaxBehavior();
this.add(talker);    

コンストラクターで

そして、後で、次のようなものを置きます

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ");";

JSに。

where GridAjaxBehaviorextends AbstractDefaultAjaxBehavior. JS が呼び出したときに GridAjaxBehavior が XML を吐き出すようにします。

私はこれを正しい方法でやっていますか?XML を吐き出すために GridAjaxBehaviour は何をすべきでしょうか?

ありがとう

4

2 に答える 2

1

何のために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にフィードすることです。それがあなたの目的であるかどうか私に知らせてください、そして私は完全に要点を逃しました。;)

于 2009-04-04T17:29:27.067 に答える