2

ユーザーが文字列を書き込むときに現在の値を取得するためTextFieldに を追加した場所があります。AjaxFormComponentUpdatingBehavior

filterByObject = new TextField<String>("filterByObject", true, new PropertyModel<String>(searchParams, "objectFilter"));
AjaxFormComponentUpdatingBehavior  changeFilterBinded = new AjaxFormComponentUpdatingBehavior ("onkeyup") {
    @Override
    protected void onUpdate(AjaxRequestTarget target) {                         
        target.addComponent(componentToUpdate);
    }
};
filterByObject.add(changeFilterBinded);

の中にいくつかの文字を入れるとtextfieldonUpdateメソッドが正しく呼び出され、コンポーネントが の現在の状態に基づいてsearchParams正しく変更されます。残念ながら、Backspace挿入したものをキャンセルするために使用すると、onUpdateが呼び出されません。

イベント ( onkeypress、など)onkeydownを変更しようとしましonchangeたが、うまくいきません。のみonChange動作しますが、フォーカスを別のコンポーネントに変更する必要があります。

どうすればその日を救うことができますか?

4

1 に答える 1

3

バックスペースキーを押した結果、フィールドへの入力が無効になりましたか(フィールドに追加された、setRequiredまたはフィールドに追加されました)?IValidatorそうである場合、ユーザー入力が無効になり、AjaxFormComponentUpdatingBehaviorを使用してコンポーネントのModelObjectに到達しないため、のonError代わりにメソッドが呼び出されます。onUpdate

AjaxFormComponentUpdatingBehavior  changeFilterBinded = 
  new AjaxFormComponentUpdatingBehavior ("onkeyup") {
    @Override
    protected void onUpdate(AjaxRequestTarget target) {     
        // Here the Component's model object has already been updated
        target.addComponent(componentToUpdate);
    }
    @Override
    protected void onError(AjaxRequestTarget target, RuntimeException e){
         // Here the Component's model object will remain unchanged, 
         // so that it doesn't hold invalid input
    }
};

ajaxIFormValidator化されたコンポーネントに関連するものは自動的に実行されないため、モデルオブジェクトを更新する前に、手動で入力を確認することをお勧めします。AjaxFormComponentBehaviorをオーバーライドすることで、モデルオブジェクトを自動的に更新しないように指示できますgetUpdateModel()。次に、onUpdateメソッドで、を使用してコンポーネントの新しい入力を取得しますgetConvertedInput()

ちなみに、onkeyupバックスペースキーを押すと発火するはずです。少なくともそれはこのフィドルで行われ、一般的にそれから焦点を合わせるときonchangeにトリガーされます。<input type="text">

また、HTML5ではoninputイベントハンドラーが導入されており、ニーズにより適している場合があります。テキストフィールドにコピー/貼り付けしても発生します。詳細については、次のリンクを参照してください。フォールバックとしてonkeyup/onkeydownを指定したoninputイベントハンドラーの使用

于 2012-07-10T09:58:04.057 に答える