2

EditableLabel という新しいコンポーネントを作成したいと思います。(AjaxEditableLabel がありますが、その動作が好きではありませ<span><input>

少なくとも onchange で、AJAX 対応にしたいのですが。ただし、ユーザーは AJAX を省略できる必要があります。理想的には、彼はBehavior.

私の実装は CSS ベースです。これは常に入力であり、外観を変更するだけです。これは JavaScript を介して行われるため、AJAX なしでも使用できます。

これまでのところ、私は試しました

  • onRequest() で使用AbstractAjaxBehaviorする requestCycle.scheduleRequestHandlerAfterCurrent(new TextRequestHandler("text/plain", "UTF-8", ret));と、テキスト フィールドはvalue適切なときに送信します (Enter が押された、フォーカスが失われたなど)。

    ここでの問題は、AjaxRequestTarget を使用できないことです。このアプローチは、オートコンプリートなどの単純なサーバーとクライアントの通信用です。

  • 単純にTextFieldwithを使用しAjaxFormComponentUpdatingBehavior("update")ます。

    問題は、JavaScript イベント ハンドラーと競合することです。

これに対する正しいアプローチは何でしょうか?サーバーの応答に依存する CSS の変更を行わないように (つまり、サーバーが送信するものを再レンダリングしないように)、JavaScript イベント ハンドラーを wicket でコーディングする方法があると思いますが、Wicket はイベントが衝突しないように JS を作成します。

このトピックに関する例を歓迎します。

4

1 に答える 1

0

問題がイベント ハンドラーの衝突である場合は、クラス内でそれらすべてをモデル化し、ユーザーが望むものに従って必要なものを出力できます。ユーザーが AJAX を必要としない場合は、a を使用しSimpleAttributeModifierてイベント ハンドラーを出力します。

TextField t = new TextField("id");
t.add(new SimpleAttributeModifier("onchange", "alert('hi!')"));

AttributeModifierイベント ハンドラーがいくつかの条件に応じて動的になる場合は、より強力なものを使用することもできます。AttributeModifierCSS クラスはまたはによっても操作できることを考慮してくださいAttributeAppender

ユーザーが AJAX を必要とする場合は、動作を追加するだけです。カスタム JavaScript を ajax イベント ハンドラーに追加する場合は、オーバーライドAbstractDefaultAjaxBehavior#getAjaxCallDecorator()して、またはその便利なサブクラスのいずれかを返してIAjaxCallDecorator、カスタム JavaScript を ajax 呼び出しの先頭または末尾に追加できます。呼び出しが成功または失敗で終了したときに、カスタム JS を追加することもできます。

TextField t = new TextField("id");
t.add(new AjaxEventBehavior("update") { 
    @Override
    protected void onEvent(AjaxRequestTarget target) {
        // ...
    }
    @Override
    protected IAjaxCallDecorator getAjaxCallDecorator() {
        return new AjaxCallDecorator(){
            @Override
            public CharSequence decorateScript(CharSequence script) { 
                return "alert('hi!')" + script; 
            }
        }
     }
});
于 2013-01-11T10:21:12.693 に答える