我遇到了一个非常有趣的问题。这是我的情景:
我的目标
我的方法
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>
我的结果
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 :?当然,任何见解和/或建议都很高 赞赏。
答案 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点击链接,你至少可以检查它是否能解决问题。