我正在构建一个允许用户输入数据库连接参数的表单。输入参数后 用户可以测试(btnTester)是否可以使用其参数建立连接。
在所有情况下,都会为用户生成一条消息。这里是来自支持bean代码的连接尝试失败的示例:
(...)
addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
(...)
这是表单代码。我希望消息显示在p:消息中。不幸的是,没有任何事按钮后没有显示消息(连接成功与否): 即使将global属性设置为false或true。
<h:form prependId="false">
(...)
<h:panelGrid>
<!-- Other form components here -->
<f:facet name="footer">
<p:commandButton
id="btnTester"
value="Tester"
actionListener="#{assistantCreationSourcesBean.testerConnexionBase}"
update="msgTester" />
<p:message id="msgTester" for="btnTester" />
</f:facet>
</h:panelGrid>
</h:form>
我错过了什么?
答案 0 :(得分:4)
我认为你的问题在这里:
addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
我假设您正在呼叫FacesContext.addMessage()
。第一个参数是组件id字符串。如果将其设置为null,则强制将消息作为全局消息。您定义的<p:message>
组件设置为for="btnTester"
,因此它只显示组件ID与btnTester组件的ID匹配的消息。
除了addMessage()
的Javadoc:
如果clientId不为null,则将FacesMessage附加到与指定客户端标识符关联的消息集。如果clientId为null,则假定此FacesMessage不与任何特定组件实例关联。
答案 1 :(得分:3)
您在update
上缺少<p:commandButton>
属性,该属性指定要更新的<p:message>
组件的ID。
您应该给出消息组件和ID,并在commandButton的update
中指定它。
答案 2 :(得分:2)
我使用咆哮而不是消息来解决我的问题。
答案 3 :(得分:1)
找到一个与Prime face中的消息完美配合的解决方案。
思想与你分享,即使你用咆哮来解决这个问题
以下是解决方案
add addMessage有2个参数,一个UIComponent Client Id和FacesMessage。 facesMessage显示或定义消息,Component Child Id显示组件的位置。 在这里你错过了组件部分。 为了使其工作,您应该将UIComponent与bean类绑定。 这样它就可以找到Component。
现在执行以下操作,
在bean类中定义一个UIComponent
使用相应的命令Button
绑定它并从bean类
中获取Id
您的代码必须像这样更改
> private UIComponent component;
(...)
addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Connection failed.", t.getLocalizedMessage()));
(...)
在xhtml文件中,您必须绑定UIComponent
<h:form prependId="false">
(...)
<h:panelGrid>
<!-- Other form components here -->
<f:facet name="footer">
<p:commandButton
id="btnTester"
value="Tester"
actionListener="#{assistantCreationSourcesBean.testerConnexionBase}"
update="msgTester"
binding="#{assistantCreationSourcesBean.component}"/>
<p:message id="msgTester" for="btnTester" />
</f:facet>
</h:panelGrid>
</h:form>
现在消息将有效.. !!对我而言,它非常有效:)
答案 4 :(得分:1)
此处“for”属性不适用于p:message使用p:messages代替。
<p:messages id="txtname" showIcon="false"
showDetail="true" showSummary="false"
redisplay="false" for="someKey" display="text"/>
答案 5 :(得分:0)
我的猜测是您尝试更新尚未呈现的组件。试试这个
使用Firefox Firebug并检查html源代码以查看是否存在组件标识msgTester
。如果不是那么它解释了为什么你的更新不会工作。你不能更新它不存在的东西。如何解决这个问题,你可以为此创建一个包装器,并更新你的包装器。你的包装器应该是它始终存在的东西,比如h:form
。如果您不想更新整个表单,则可以尝试<p:outputPanel id="wrapper">
。所以你的代码看起来像这样
<h:form>
...
<p:outputPanel id="wrapper">
<p:commandButton ... update="wrapper"/>
<p:message />
</p:outputPanel>
</h:form>
尝试这个,让我知道它是否有效。
答案 6 :(得分:0)
我最近在PrimeFaces 6.0.19中遇到了这个问题。
事实证明,在调用addMessage()方法之前,必须必须调用entity-b.module
才能正确显示消息。
即
const routes: Routes = [
{
path: 'b',
component: EntityBComponent,
children: [
{
path: 'detail',
component: EntityBDetailComponent,
outlet: 'details',
},
]
},
];
@NgModule({
imports: [
RouterModule.forChild(routes),
CommonModule
],
declarations: [
EntityBComponent,
EntityBDetailComponent
],
exports: [
EntityBComponent,
EntityBDetailComponent
]
})
export class EntityBModule { }