Wicket - AjaxFormComponentUpdatingBehavior和退格

时间:2012-07-10 09:38:03

标签: java ajax wicket onkeyup backspace

我有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);

当我在textfield内放置一些字符时,正确调用onUpdate方法,并且我的组件(基于当前状态searchParams)会正确更改。 不幸的是,当我使用 Backspace 来取消我插入的内容时,onUpdate没有被调用。

我尝试更改活动(onkeypressonkeydownonchange等等...但是它不起作用。只有onChange有效,但我必须将焦点更改为其他组件。

如何保存这一天?

1 个答案:

答案 0 :(得分:3)

由于按退格键,字段中的输入是否无效(根据添加到字段的setRequiredIValidator)?如果是,则将调用onError方法而不是onUpdate,因为用户输入将无效,因此无法使用AjaxFormComponentUpdatingBehavior到达组件的ModelObject。

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
    }
};

请记住,涉及ajax-ified组件的任何IFormValidator都不会自动执行,因此您可能有兴趣在更新模型对象之前手动检查输入(如果是这种情况)。您可以通过覆盖getUpdateModel()告诉AjaxFormComponentBehavior不要自动更新模型对象。然后,在onUpdate方法中,通过getConvertedInput()获取组件的新输入。

作为旁注,按下退格键时,onkeyup应该被触发。至少它在this fiddle中执行,onchange通常在<input type="text">注意到它时被触发。

此外,HTML5引入了oninput事件处理程序,它可能更适合您的需求。即使在文本字段中复制/粘贴,它也会被触发。有关详细信息,请参阅以下链接:Using the oninput event handler with onkeyup/onkeydown as its fallback