我正在实现一些搜索过滤器。一个<p:commandLink>
显示在每个搜索组件旁边( <p:inputText>
、 <p:selectOneMenu>
等)。
<p:inputText id="text" value="#{bean.text}" required="true"/>
<h:panelGroup id="panelGroup">
<p:commandLink process="@this text" update="panelGroup text" actionListener="#{bean.action}" rendered="#{empty param['form:text']}">
<h:outputText styleClass="ui-icon ui-icon-search"/>
</p:commandLink>
<p:commandLink process="@this" update="panelGroup text" actionListener="#{bean.resetAction}" rendered="#{not empty param['form:text']}">
<h:outputText styleClass="ui-icon ui-icon-trash"/>
<p:resetInput target="text"/>
</p:commandLink>
</h:panelGroup>
当第一个<p:commandLink>
(带有搜索图标的那个)被单击并给出 <p:inputText>
不为空,则该链接预计会消失,并且预计会呈现另一个链接(带有垃圾桶图标的链接)(反之亦然)。
发生这种情况,但不会调用第一个链接 ( actionListener="#{bean.action}"
) 指示的操作监听器,因为该链接是根据 <p:inputText>
的值呈现的。 。 rendered="#{empty param['form:text']}"
负责阻止监听器被调用。
此外,当带有垃圾桶图标的链接出现时,如果单击它但它没有消失,它会重置输入组件。仅当再次单击时它才会消失(然后搜索出现)。
遇到这种情况该如何正确处理?如果没有违反验证/转换并且单击搜索链接,则该链接应该消失并且应该呈现垃圾链接。
相反,当垃圾链接出现并且点击它时,它应该重置 <p:inputText>
然后消失,以便可以呈现搜索链接。
最佳答案
您实际上只想在调用操作之后切换渲染。也就是说,在应用请求值阶段,当操作事件即将排队时,也会遵守 rendered
属性。如果其计算结果为 false
,则操作事件不会排队,因此在调用应用程序阶段不会调用该操作。
最好直接检查模型值。在设置模型值之前,操作会排队。而且,当模型值进行转换/验证时,这也应该能更好地工作。
<p:inputText ... value="#{bean.text}" />
<p:commandLink ... rendered="#{empty bean.text}" />
<p:commandLink ... rendered="#{not empty bean.text}" />
关于jsf - 有条件渲染 p :commandLinks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26150466/