【问题标题】:Wicket - AjaxFormComponentUpdatingBehavior and backspaceWicket - AjaxFormComponentUpdatingBehavior 和退格
【发布时间】:2012-07-10 09:38:03
【问题描述】:

我有一个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 有效,但我必须将焦点转移到另一个组件。

我怎样才能挽救这一天?

【问题讨论】:

    标签: java ajax wicket onkeyup backspace


    【解决方案1】:

    字段中的输入是否无效(根据字段中添加的setRequiredIValidators)是按退格键的结果吗?如果是,则将调用 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 化组件的IFormValidator 都不会自动执行,因此如果是这种情况,您可能有兴趣在更新模型对象之前手动检查输入。你可以告诉AjaxFormComponentBehavior不要通过覆盖getUpdateModel()来自动更新模型对象。然后,在onUpdate方法中,通过getConvertedInput()获取组件的新输入。

    作为旁注,onkeyup 应该在按下退格键时被触发。至少在this fiddle 中是这样,而onchange 通常在关注&lt;input type="text"&gt; 时触发。

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

    【讨论】:

    • 我试过了,按退格键时调用了 onError 而不是 onUpdate。抱歉,我不明白如何解决这个问题。
    • onError 被调用,因为您要添加 ajax 行为的字段上的验证器失败。例如,如果该字段是必需的,并且您从中删除了所有字符,则它的输入无效,因此 Wicket 会阻止它访问模型对象。问题是,在这种情况下你想做什么?如果它是您正在更新的搜索结果,您可能有兴趣清除结果并显示错误(使用error()FeedbackPanel,并将FeedbackPanel 添加到目标中)。请注意,您还可以在onError 中向AjaxRequestTarget 添加组件。
    • 谢谢。有用。字段的目的只是动态更新电子邮件列表,因此没有必要。我必须停下来复制和粘贴组件:P
    • 呵呵 :) 或者利用 Wicket 的 OOP 功能并定义通用组件 - 一次编写,随处运行!
    • 更烦人的是,由于模型验证失败,模型对象没有更新。例如,如果您有一个字段,您在其中写入一个值并使用最小为 0 的 RangeRalidator,则不接受空字符串!因此,您键入“5”,模型现在是 5,您按退格键,错误 - 但模型保持 5。不得不放弃整个检票口 ajax 处理并改为在 jQuery 中执行(基本上只是获取一个输入字段并进行计算应该在另一个标签中呈现)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多