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,等...) onkeydownonchange但它不起作用。只能onChange工作,但我必须将焦点转移到另一个组件。

我怎样才能挽救这一天?

4

1 回答 1

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

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

作为旁注,onkeyup按下退格键时应该被解雇。至少它在这个小提琴中确实如此,并且onchange通常<input type="text">在专注于它时触发。

此外,HTML5 引入了oninput事件处理程序,它可能更适合您的需求。即使在文本字段中复制/粘贴,它也会被触发。有关更多信息,请参阅以下链接:使用 oninput 事件处理程序并将 onkeyup/onkeydown 作为其后备

于 2012-07-10T09:58:04.057 回答