Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止在多次更新某些类似组件时触发ajax请求?_Ajax_Jsf_Jsf 2_Richfaces - Fatal编程技术网

如何防止在多次更新某些类似组件时触发ajax请求?

如何防止在多次更新某些类似组件时触发ajax请求?,ajax,jsf,jsf-2,richfaces,Ajax,Jsf,Jsf 2,Richfaces,给定一个RichFaces数据表,每一行都绑定到一个“onclick”事件,触发一个ajax请求来呈现同一页面上的一个帧,是否可以防止发送类似的请求 类似地,我的意思是用户正在快速单击表的每一行。这会导致多个(可能代价高昂)请求被发送到后端,而只有最后一个请求足以正确呈现我想要的内容 我以为Richfaces队列提供了这个功能,但我无法让它工作。ajax请求是使用a4j:jsFunction生成的请求发送的 以下是我尝试的JSF代码: <h:form> <a4j:queue

给定一个RichFaces数据表,每一行都绑定到一个“onclick”事件,触发一个ajax请求来呈现同一页面上的一个帧,是否可以防止发送类似的请求

类似地,我的意思是用户正在快速单击表的每一行。这会导致多个(可能代价高昂)请求被发送到后端,而只有最后一个请求足以正确呈现我想要的内容

我以为Richfaces队列提供了这个功能,但我无法让它工作。ajax请求是使用a4j:jsFunction生成的请求发送的

以下是我尝试的JSF代码:

<h:form>
  <a4j:queue ignoreDupResponses="true" name="selectRow" />
  <rich:datatable ...>
    [...]
    <rich:column ... />
  </rich:datatable>

  <a4j:jsFunction name="jsSelectRow" actionListener="yyy" render="xxx">
    <a4j:attachQueue name="selectRow"/>
  </a4j:jsFunction>
  <script toAddOnClickEventFiringJsSelectRowOnTR />  
</h:form>


  • 第二个解释了我想要什么,但对于旧版本,我无法重现“将控件合并到同一组”段落中的预期结果

    我使用的是RichFaces 4.3.3.Final

    编辑:在用例上更加精确。我希望行在一般情况下立即出现(应该没有/几乎没有延迟):只要客户机/网络/服务器能够足够快地处理它,就可以发出大量请求

    现在,真正的用例是当连接非常慢时。ajax响应需要时间才能返回,我希望在收到第一个响应之前不会发送新的ajax请求。也就是说,队列不应等待延迟过期,而应丢弃已被最近的请求淘汰的排队请求


    事实上,当我再次阅读我的第二个链接时,我认为这正是
    所要做的,但这些属性在我的(较新的)Richfaces版本中似乎不可用…

    这里似乎准确地解释了您试图实现的目标:

    requestDelay是发送请求之前等待的毫秒数 请求以合并类似的请求。值越大 快速键入时发送的请求将更少。类似的要求 队列在等待请求延迟时合并

    如果ignoreDupResponse为true,则RichFaces不会浪费时间更新 如果客户端DOM知道对同一事物的另一个请求是 悬而未决的在本演示中,最好的方法是将requestDelay设置为 一个非常小的值并快速键入。您将看到DOM的数量 更新不能小于发送的请求

    所以在你的例子中可能是这样的:

    <a4j:queue requestDelay="300" ignoreDupResponses="true" name="selectRow" />
    

    事实上,它解决了人们提出的问题。也许我应该解释一下这个用例。重新“编辑”:ignoreDupResponses实际上就是这样做的——放弃当前请求,转而使用新请求(基本上是dropNext策略)。请描述您为达到目标要求所做的最佳尝试,并解释您希望以不同方式工作的具体内容。