我有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
没有被调用。
我尝试更改活动(onkeypress
,onkeydown
,onchange
等等...但是它不起作用。只有onChange
有效,但我必须将焦点更改为其他组件。
如何保存这一天?
答案 0 :(得分:3)
由于按退格键,字段中的输入是否无效(根据添加到字段的setRequired
或IValidator
)?如果是,则将调用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。