Primefaces 自动完成组件的问题
Problem with Primefaces Autocomplete Component
我有一个使用 JDK 8、JSF 2.2(JBoss 提供的实现)、Spring 4.2 和 Primefaces 6.2
开发的本地 Web 应用程序
在应用程序中,我有一个 XHTML 页面用于编辑对象的某些字段,该对象是名为 SiepRoEncabezado 的 class 的实例。其中一个字段是 SiepRpaPescador 的实例。
直到昨天,为了 select 一个 SiepRpaPescador 对象,我将一个 <p:selectOneMenu>
包含在一个包含在模态对话框中的表单中。模态本身有 2 个提交 <p:commandButton>
(一个用于保存更改,一个用于清理表单)和一些额外的输入字段。
模式的开发方式是在我按下保存按钮后成功编辑数据时自动关闭。
<p:selectOneMenu>
的模式运行良好,但由于在内存使用方面有太多 select 项需要处理,我被迫将 <p:selectOneMenu>
替换为以下组件:
<p:autoComplete dropdown="true"
id="rpaAutoComplete"
value="#{correccionROBean.tmpPescador}"
var="itemRpa"
itemLabel="#{itemRpa.nmPescador.concat(' ').concat(itemRpa.nmPaterno).concat(' ').concat(itemRpa.nmMaterno)}"
itemValue="#{itemRpa}"
completeMethod="#{correccionROBean.filtrarRpa}"
minQueryLength="4"
maxResults="10"
forceSelection="true" />
在那里,tmpPescador 是Managed Bean CorreccionROBean 中的一个bean。
那里的完整方法工作正常, selection 项目按需要显示。
但是,在我 select <p:autoComplete>
组件中的一项并按下按钮以保存更改后,它什么也没做。此外,它不会显示错误消息,也不会抛出任何异常。最糟糕的是,如果我尝试调试按钮中的动作侦听器方法以保存更改,它什么也不做,就像根本没有调用动作侦听器方法一样。
我放了一个 <p:ajax>
标签希望能解决问题但无济于事:
<p:autoComplete dropdown="true"
id="rpaAutoComplete"
value="#{correccionROBean.tmpPescador}"
var="itemRpa"
itemLabel="#{itemRpa.nmPescador.concat(' ').concat(itemRpa.nmPaterno).concat(' ').concat(itemRpa.nmMaterno)}"
itemValue="#{itemRpa}"
completeMethod="#{correccionROBean.filtrarRpa}"
minQueryLength="4"
maxResults="10"
forceSelection="true">
<p:ajax event="itemSelect" listener="#{correccionROBean.onRpaSelect}" update="rpaAutoComplete"/>
</p:autoComplete>
这里,当我select一项时,没有触发监听方法。当我尝试调试该方法时,好像根本没有调用该方法。
最后,当我在没有 selecting <p:autoComplete>
中的项目的情况下按下保存按钮时,然后并且只有在那时,才会触发保存 <p:commandButton>
中的动作侦听器方法。
什么可能导致这种行为?
提前致谢。
编辑
我将字段 immediate="true"
添加到自动完成组件并触发了 ajax 提交方法,但仍然无法执行保存按钮动作侦听器方法
已解决。
请参阅 Melloware 的回答和我对该回答的回复以获取更多详细信息。
对于那些不熟悉转换器的人:
JSF API 中定义的接口 Converter 允许将输入和输出的数据转换为自动完成组件(以及其他一些 JSF UI 组件及其 sub-classes).该接口有两个方法:
public Object getAsObject(FacesContext context, UIComponent component, String value)
:此方法必须 return 一个对象,它是与自动完成组件的 value
字段中定义的值相同 class 的实例(在我的例子中,它 return 是一个 SiepRpaPescador 对象)。您必须处理此方法中的异常,因为它会在两种情况下自动调用:
当您在自动完成文本字段中输入字符且输入的字符数等于或大于自动完成组件的minQueryLength
字段中定义的值或默认值时如果未指定值(在我的例子中,当我输入 4 个或更多字符时)。在这种情况下,此方法中的 value
参数将是您输入的 String
。请注意,如果您在我的情况下启用了下拉菜单 (dropdown="true"
) 并按下了下拉按钮,则不会调用此方法。
当您提交表单时。在这种情况下,value
将是自动完成组件中 labelValue
字段的值(在我的例子中,#{itemRpa.nrFolio}
)使用定义的 toString
方法转换为字符串在 class 中,该值是(#{itemRpa.nrFolio}
是一个 Integer
的实例,因此将使用整数 class 自己实现的 toString()
来转换该值或者在 Object
class 中,如果没有定义 toString()
的实现。
public String getAsString(FacesContext context, UIComponent component, Object value)
:此方法必须return一个String
表示要在自动完成组件中显示的每个项目的标签值。参数 value
是与自动完成组件的 labelValue
字段中定义的值相同的 class 的实例。显示项目时会自动调用此方法(无论您是在自动完成的文本字段中输入字符还是按下下拉按钮(如果存在)都没有关系),并且会根据字段中定义的次数调用此方法 maxResults
(在我的例子中,10)在自动完成中,使用从 completeMethod
的 returned 列表中获得的对象(在我的例子中,从 #{correccionROBean.filtrarRpa}
中获得的列表中的每个对象,此方法获得它的 nrFolio
,正如我在自动完成的 labelValue
字段中建立的那样。
希望对大家有所帮助
我有一个使用 JDK 8、JSF 2.2(JBoss 提供的实现)、Spring 4.2 和 Primefaces 6.2
开发的本地 Web 应用程序在应用程序中,我有一个 XHTML 页面用于编辑对象的某些字段,该对象是名为 SiepRoEncabezado 的 class 的实例。其中一个字段是 SiepRpaPescador 的实例。
直到昨天,为了 select 一个 SiepRpaPescador 对象,我将一个 <p:selectOneMenu>
包含在一个包含在模态对话框中的表单中。模态本身有 2 个提交 <p:commandButton>
(一个用于保存更改,一个用于清理表单)和一些额外的输入字段。
模式的开发方式是在我按下保存按钮后成功编辑数据时自动关闭。
<p:selectOneMenu>
的模式运行良好,但由于在内存使用方面有太多 select 项需要处理,我被迫将 <p:selectOneMenu>
替换为以下组件:
<p:autoComplete dropdown="true"
id="rpaAutoComplete"
value="#{correccionROBean.tmpPescador}"
var="itemRpa"
itemLabel="#{itemRpa.nmPescador.concat(' ').concat(itemRpa.nmPaterno).concat(' ').concat(itemRpa.nmMaterno)}"
itemValue="#{itemRpa}"
completeMethod="#{correccionROBean.filtrarRpa}"
minQueryLength="4"
maxResults="10"
forceSelection="true" />
在那里,tmpPescador 是Managed Bean CorreccionROBean 中的一个bean。
那里的完整方法工作正常, selection 项目按需要显示。
但是,在我 select <p:autoComplete>
组件中的一项并按下按钮以保存更改后,它什么也没做。此外,它不会显示错误消息,也不会抛出任何异常。最糟糕的是,如果我尝试调试按钮中的动作侦听器方法以保存更改,它什么也不做,就像根本没有调用动作侦听器方法一样。
我放了一个 <p:ajax>
标签希望能解决问题但无济于事:
<p:autoComplete dropdown="true"
id="rpaAutoComplete"
value="#{correccionROBean.tmpPescador}"
var="itemRpa"
itemLabel="#{itemRpa.nmPescador.concat(' ').concat(itemRpa.nmPaterno).concat(' ').concat(itemRpa.nmMaterno)}"
itemValue="#{itemRpa}"
completeMethod="#{correccionROBean.filtrarRpa}"
minQueryLength="4"
maxResults="10"
forceSelection="true">
<p:ajax event="itemSelect" listener="#{correccionROBean.onRpaSelect}" update="rpaAutoComplete"/>
</p:autoComplete>
这里,当我select一项时,没有触发监听方法。当我尝试调试该方法时,好像根本没有调用该方法。
最后,当我在没有 selecting <p:autoComplete>
中的项目的情况下按下保存按钮时,然后并且只有在那时,才会触发保存 <p:commandButton>
中的动作侦听器方法。
什么可能导致这种行为? 提前致谢。
编辑
我将字段 immediate="true"
添加到自动完成组件并触发了 ajax 提交方法,但仍然无法执行保存按钮动作侦听器方法
已解决。
请参阅 Melloware 的回答和我对该回答的回复以获取更多详细信息。
对于那些不熟悉转换器的人:
JSF API 中定义的接口 Converter 允许将输入和输出的数据转换为自动完成组件(以及其他一些 JSF UI 组件及其 sub-classes).该接口有两个方法:
public Object getAsObject(FacesContext context, UIComponent component, String value)
:此方法必须 return 一个对象,它是与自动完成组件的value
字段中定义的值相同 class 的实例(在我的例子中,它 return 是一个 SiepRpaPescador 对象)。您必须处理此方法中的异常,因为它会在两种情况下自动调用:
当您在自动完成文本字段中输入字符且输入的字符数等于或大于自动完成组件的
minQueryLength
字段中定义的值或默认值时如果未指定值(在我的例子中,当我输入 4 个或更多字符时)。在这种情况下,此方法中的value
参数将是您输入的String
。请注意,如果您在我的情况下启用了下拉菜单 (dropdown="true"
) 并按下了下拉按钮,则不会调用此方法。当您提交表单时。在这种情况下,
value
将是自动完成组件中labelValue
字段的值(在我的例子中,#{itemRpa.nrFolio}
)使用定义的toString
方法转换为字符串在 class 中,该值是(#{itemRpa.nrFolio}
是一个Integer
的实例,因此将使用整数 class 自己实现的toString()
来转换该值或者在Object
class 中,如果没有定义toString()
的实现。
public String getAsString(FacesContext context, UIComponent component, Object value)
:此方法必须return一个String
表示要在自动完成组件中显示的每个项目的标签值。参数value
是与自动完成组件的labelValue
字段中定义的值相同的 class 的实例。显示项目时会自动调用此方法(无论您是在自动完成的文本字段中输入字符还是按下下拉按钮(如果存在)都没有关系),并且会根据字段中定义的次数调用此方法maxResults
(在我的例子中,10)在自动完成中,使用从completeMethod
的 returned 列表中获得的对象(在我的例子中,从#{correccionROBean.filtrarRpa}
中获得的列表中的每个对象,此方法获得它的nrFolio
,正如我在自动完成的labelValue
字段中建立的那样。
希望对大家有所帮助