【问题标题】:Wicket 6.1 AjaxEventBehavior - how to set delay?Wicket 6.1 AjaxEventBehavior - 如何设置延迟?
【发布时间】:2012-10-16 10:27:46
【问题描述】:
AjaxEventBehavior behavior = new AjaxEventBehavior("keyup"){

    @Override
    protected void onEvent(AjaxRequestTarget target) {

        System.out.println("Hello world!");
    }
};

form.add(behavior); 

在以前版本的 Wicket 中,我可以这样做:

behavior.setThrottleDelay(Duration.ONE_SECOND);

但是从 6.1 版开始,这个机会已经被抹去。网络上到处都是以前版本的教程,它们都包含 .setThrottleDelay() 方法。

基本上,目标是在用户停止输入表单时唤出行为。目前,每次当密钥启动时,它都会立即调用该行为,这基本上会向服务器端发送垃圾邮件。这就是为什么我想推迟。背景:我目前正在尝试对数据库进行查询并获取类似于表单输入的数据。所有这些都发生在这个人打字的时候。但是为了将服务器端/SQL 保持在“轰炸范围”之外,需要延迟。

我也愿意接受其他选择。

【问题讨论】:

    标签: java ajax wicket


    【解决方案1】:

    对于 6.0.0 版本,设置节流阀的设置已与 AjaxRequestAttributes 中的所有其他 Ajax 设置统一,该版本是主要版本,不是直接替换。

    https://cwiki.apache.org/confluence/display/WICKET/Wicket+Ajax 包含一个包含所有设置的表格,在底部提到了限制。

    使用它:

    AjaxEventBehavior behavior = new AjaxEventBehavior("keyup") {
    
        @Override
        protected void onEvent(AjaxRequestTarget target) {
            System.out.println("Hello world!");
        }
        @Override
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
            super.updateAjaxAttributes(attributes);
            attributes.setThrottlingSettings(
                new ThrottlingSettings(id, Duration.ONE_SECOND, true)
            );
        }
    };
    

    最后一个构造函数参数是你需要的。检查它的javadoc。

    【讨论】:

    • 您的代码示例将“id”作为 ThrottlingSettings 的第一个参数传递 - 这个变量是什么?
    • 我也被'id'参数迷惑了!!??
    • 来自 Javadoc:客户端限制代码使用此 ID 来跟踪各种事件限制。通常,您可以在此处使用任何唯一 ID,例如组件的 markupId (WebComponent#getMarkupId())。要将多个不同的事件与一个油门联合起来,请为它们提供相同的 ID。
    • Wicket 7 会在您未明确设置节流器 ID 时自动为您设置组件标记 ID。
    • 请检查您的代码,似乎缺少{
    【解决方案2】:

    查看源代码,您可以通过getAttributes() 获取AjaxRequestAttributes 并为此致电setThrottlingSettings()

    奇怪的是wiki中没有提到api更改。 6.1 的公告称其为替代品。

    【讨论】:

    • 此更改已针对 6.0.0 进行,并在 cwiki.apache.org/confluence/display/WICKET/Wicket+Ajax(Ajax 的扩展迁移页面)中进行了描述。
    • @martin-g:谢谢。 OP 写道它是在 6.1 中引入的(这会很奇怪),我没有检查。感谢您清除它。
    【解决方案3】:

    看来drop behavior 是你所追求的:

    dropping - 只处理最后一个 Ajax 请求,所有之前的 计划的请求被丢弃

    您可以通过updateAjaxAttributes 使用AjaxChannel.DROP 自定义行为的AjaxRequestAttributes 来指定仅适用于Ajax 通道的丢弃行为,正如wiki 中指出的那样:

    AjaxEventBehavior behavior = new AjaxEventBehavior("keyup"){
    
        @Override
        protected void onEvent(AjaxRequestTarget target) {
            System.out.println("Hello world!");
        }
        @Override
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
            super.updateAjaxAttributes(attributes);
            attributes.setChannel(new AjaxChannel("myChannel", AjaxChannel.Type.DROP));
        }
    };
    
    form.add(behavior); 
    

    正如@bert 还建议的那样,您也可以将setThrottlingSettings 发送到AjaxRequestAttributes

    这两种行为的组合可能更符合您的需求。

    【讨论】:

    • getAttributes() 是 AbstractDefaultAjaxBehavior 的最后一个方法,我无法覆盖它。通过阅读源代码,我还通过 AjaxFormValidatingBehavior 找到了 setThrottlingSettings,但当时和现在它也给了我一个错误(最重要的问题)。
    • 你是对的,正如wiki 中所指出的那样,覆盖应该在updateAjaxAttributes 上。我已经更新了答案
    • DROP 无法解析或不是字段。即使 AjaxChanne.Type 显示“DROP”。 @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes){ ThrottlingSettings throttlingSettings = new ThrottlingSettings("throttle",Duration.ONE_SECOND); attributes.setThrottlingSettings(throttlingSettings); attributes.setChannel(AjaxChannel.DROP); } 现在,当我在表单中获取 keyup 时,它会等待一秒钟并输出“Hello world!”如果我再次输入,那么它就不会再这样做了。真的很抱歉哈维打扰了你,但是关于这个主题的网络真的很空。 :)
    • 其实你需要使用它的构造函数来构造一个新的AjaxChannel。为其提供名称和 AjaxChannel.Type.DROP。也很抱歉,我从未使用过它(用于覆盖 AjaxBehavior 的 getChannelName() 以在 Wicket 1.3 中返回 0|d),并且没有测试代码是否可以立即工作。
    • 谢谢,哈维,现在有了这个错误就可以了。但是对于仅调用一次 onEvent() 的问题还有什么进一步的想法吗?
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多