PrimeFaces自动完成:itemSelect与更改事件

时间:2013-09-04 16:03:11

标签: jsf javascript-events primefaces autocomplete

我需要在更改为文本框时触发ajax更新,该文本框是<p:autoComplete>组件。我观察到如果用户选择手动键入文本,则事件是更改,而如果用户单击自动完成的其中一个建议,则事件为itemSelect。所以我在输入中添加了两个<p:ajax>子项,每个子项调用相同的方法并具有相同的更新列表,但其中一个具有event="change"而另一个event="itemSelect"

然而,我现在发现一些奇怪的东西。例如,在正常服务器模式下,我打开了我的页面并键入了&#34; 12&#34;。自动完成提供&#34; 1233&#34;和&#34; 1234&#34;作为建议。我点击了&#34; 1233&#34;似乎什么也没发生。我再次点击,其他所有内容都填写完毕。

在调试器中使用事件处理程序上的断点重复此操作,我可以看到在第一次单击后,值为&#34; 12&#34;然后在第二次点击时,它变为&#34; 1233&#34;。

通过切换评论两个不同的<p:ajax>,我可以看到不同的后果。没有&#34;改变&#34;一,如果用户选择自动完成建议,并且没有&#34; itemSelect&#34;一,如果用户手动输入,则永远不会调用处理程序。但是对于他们两个,有两个电话,我确信会有关于双击的投诉。

对于那些喜欢的人来说,首先是xhtml:

<p:autoComplete id="itemId" value="#{myBacker.myBean.itemNumber}"
    required="true" completeMethod="#{myBacker.idAutoComplete}">
    <p:ajax event="itemSelect" update="beanDetails"
        listener="#{myBacker.idChangeEventListener()}" />
    <p:ajax event="change" update="beanDetails"
        listener="#{myBacker.idChangeEventListener()}" />
</p:autoComplete>
<h:panelGroup id="beanDetails">
    <h:panelGroup rendered="#{not empty myBacker.myBean.institutionName}">
        <h:outputText value="#{myBacker.myBean.institutionName}" />
        <!-- Continues with address, phone, etc..  -->
    </h:panelGroup>
</h:panelGroup>

然后是Java支持bean代码:

public void idChangeEventListener() {
    myBean = myDAO.getDetails(myBean);
    //  another couple of init-type method calls
}

1 个答案:

答案 0 :(得分:10)

为父标记指定一个widgetVar属性,然后将此小属性添加到<p:ajax event="change" ...>子标记中:

onstart="if(widgetVarName.panel.is(':visible')) return false;" 

当问题写完时,如果我没记错的话,我们在PrimeFaces 3.5版本上。从那时起,我们需要将解决方案更新为:

onstart="if(PF('widgetVarName').panel.is(':visible')) return false;"
感谢mwalter指出了这一变化。