SelectManyCheckbox onHide with remoteCommand

时间:2012-10-26 18:58:42

标签: jsf jsf-2 primefaces

我遇到了一个非常有趣的问题。这是我的情景:

我的目标

  • 将SelectManyCheckbox与嵌套工具提示一起使用。
  • 使用SelectManyCheckbox onHide事件来触发Ajax(ActionListener)调用 并更新
  • SelectManyCheckbox标签和嵌套工具提示文字。

我的方法

  • 使用remoteCommand并将其绑定到SelectManyCheckbox onHide事件

XHTML

<p:selectCheckboxMenu id="sourceFilter"
                onHide="sourceFilterCommand();"
                value="#{viewRevenueBean.sourceSelectManyMenu.selectedValues}" 
                label="#{viewRevenueBean.sourceSelectManyMenu.label}"
                filter="true" filterMatchMode="contains"
                validator="#{viewRevenueBean.sourceSelectManyMenu.validate}"
                widgetVar="srcFilterDropDown">
                <f:selectItems id="sourceItems"
                              value="#{viewRevenueBean.sourceSelectManyMenu.availableItems}" 
                              var="source" itemLabel="#{source.label}" itemValue="#{source.value}" />
                <f:convertNumber type="number" />
                                    <p:tooltip id="srcToolTip" 
                                for="sourceFilter" 
                        value="#{viewRevenueBean.sourceSelectManyMenu.tooltipText}" 
                        showEffect="fade" 
                            hideEffect="fade"/>
                <p:remoteCommand name="sourceFilterCommand" update="sourceFilter"
                    actionListener=#{viewRevenueBean.sourceSelectManyMenu.defaultEventHandler}"/>       
</p:selectCheckboxMenu>

我的结果

  • Ajax(Action Listener)被触发,SelectManyCheckbox标签和嵌套工具提示被更新(预期行为)。
  • 在Firebug中,我注意到每个onHide事件Ajax调用都将前面的服务器端请求数乘以2(意外行为)。

e.g

1st onHide event  = 1 Request
2nd onHide event  = 2 Requests
3rd onHide event  = 4 Requests  
4th onHide event  = 8 Requests  
5th onHide event  = 16 Requests

等.....

这显然不是理想的,只会导致大幅减速    一对夫妇的隐藏事件。

我试过的实验

  • 我创建了一个p:命令按钮,它完成了所需的Ajax调用并更正了元素更新(没有相乘的请求) 问题) 。然后我继续窃取它的Ajax JavaScript调用 Firebug并将其放在我自己的JavaScript函数中,然后我就这样做了 用作我的onHide回调。再次,我经历了同样的不必要的 结果,标签和工具提示已更新,但请求开始 乘。

  • 我尝试将remoteCommand放在不同的位置 (在菜单之外,在它自己的形式内等)。它没有 区别。问题仍然存在。

  • 我尝试简化SelectManyCheckbox方案(删除 工具提示,变换器,调整各种属性等)以消除其他 可能性。没有不同。

  • 我使用onchange尝试了p:ajax而不是p:remoteCommand。 Ajax请求工作正常,但显然它不是我追求的。 我需要在隐藏时触发它。

  • 我尝试使用a而不是SelectCheckboxMenu 使用onchange并保留所有内容的SelectManyCheckbox(无标签) 否则一样。 remoteCommand工作正常,Ajax调用得到 叫一次,一切都很好,花花公子。 [/ list] [list] *我 尝试了PrimeFaces 3.5-SNAPSHOT。没有不同。问题是 仍然表现出来。

    迄今为止尚未在论坛或网络上找到任何线索 这个问题。这听起来像是一个bug或程序员的笨拙 :roll :?当然,任何见解和/或建议都很高 赞赏。

1 个答案:

答案 0 :(得分:0)

使用p:remoteCommand时遇到了类似的问题。我不能肯定地说根本原因在你的情况下是一样的,但也许这可能会有所帮助。

在我的情况下,问题是由jquery绑定的多次注册引起的; p:remoteCommand似乎不使用$(somesource).off(“some_event”)。on(“some_event”,some_function)。这意味着 - 据我所知 - 如果你更新包含p:remoteCommand的组件,它的动作将在每次更新时反复注册。这反过来意味着,如果你调用p:remoteCommand的名字,它将触发与注册时相同的次数。

你说你试过把它移到外面但仍然遇到同样的问题,所以也许这毕竟不是这个问题。在我的情况下,我使用p:commandLink测试了这个假设,并且调用了支持bean。我的目标是确保删除任何先前的绑定注册,因此通过注册上面提到的绑定:

$(somesource).off(“some_event”)。on(“some_event”,some_function),让some_function点击链接,你至少可以检查它是否能解决问题。