【问题标题】:Composite Component doesn't work when attribute expression bind属性表达式绑定时复合组件不起作用
【发布时间】:2014-05-10 15:05:39
【问题描述】:

我制作了一个复合组件,如果以“静态”方式使用它似乎可以正常工作,但如果我将它的一个属性绑定到表达式,它就不起作用了。

如果我使用像

这样的组件

<ez:indicadorEstadoSubsistema subSystemName="Server" status="someIntLiteral"/>

工作正常,但我需要以更动态的方式使用它,例如

<ez:indicadorEstadoSubsistema subSystemName="Server" status="#{serverData.status}"/>.

我读过 JSTL 标记在视图构建时间而不是视图渲染时间运行,所以这可能是我没有在正确的时间评估状态表达式绑定的原因,但我不知道如何解决这个问题.

我的组件只是一个带有工具提示的图像。它们都依赖于“status”属性值。

组件

<cc:interface>
    <cc:attribute name="status" shortDescription="Represents the SubSystem status." required="true" default="1" type="java.lang.Integer"/>
    <cc:attribute name="subSystemName" required="true" type="java.lang.String"/>
</cc:interface>

<cc:implementation>
    <c:choose>
        <c:when test="#{cc.attrs.status eq 0}">
            <h:graphicImage id="icon" value="#{resource['images:delete.png']}" width="16" height="16"/>
            <c:set var="message" value="#{cc.attrs.subSystemName} subsystem doesn't responds."/>
        </c:when>
        <c:when test="#{cc.attrs.status eq 1}">
            <h:graphicImage id="icon" value="#{resource['images:delete.png']}" width="16" height="16"/>
            <c:set var="message" value="Unconsistent status."/>
        </c:when>
        <c:when test="#{cc.attrs.status eq 2}">
            <h:graphicImage id="icon" value="#{resource['images:warning.png']}" width="16" height="16"/>
            <c:set var="message" value="#{cc.attrs.subSystemName} system not working properly."/>
        </c:when>
        <c:when test="#{cc.attrs.status eq 3}">
            <h:graphicImage id="icon" value="#{resource['images:check.png']}" width="16" height="16"/>
            <c:set var="message" value="#{cc.attrs.subSystemName} system works fine."/>
        </c:when>
    </c:choose>
    <p:tooltip for="icon" value="#{message}" showEffect="fade" hideEffect="fade" />  
</cc:implementation>

谢谢。

【问题讨论】:

  • 什么时候设置 #{serverData.status} 中的值?
  • 在一个名为public void updateStatus() 的方法中,当用户按下命令按钮时会调用该方法。 &lt;p:commandButton id="cmdRefresh" value="Refresh" actionListener="#{serverData.updateStatus()}/&gt;
  • 这是和ajax请求在同一个页面上还是在另一个页面上执行并且updateStatus()的结果是导航到当前页面?
  • 与Ajax请求在同一页面调用。
  • 我认为这行不通,原因是如果您在数据表中使用组件,则应按行评估 EL 表达式,但标签如 c:if、c:set 或c:在构建视图时选择工作。您应该重构代码以使用渲染属性或在 EL 表达式中添加条件。如果需要,可以使用 c:set 使表达式更短。

标签: jsf jsf-2 primefaces composite-component


【解决方案1】:

一般来说,在 JSF 中使用 JSTL 标签并不是一个好主意。为什么不使用&lt;h:panelGroup&gt;?试试这样的:

<h:panelGroup rendered="#{cc.attrs.status eq 0}">
    <h:graphicImage id="icon" value="#{resource['images:delete.png']}" width="16" height="16"/>
    <ui:param var="message" value="#{cc.attrs.subSystemName} subsystem doesn't responds."/>
</h:panelGroup>
<p:tooltip for="icon" value="#{message}" showEffect="fade" hideEffect="fade" />

【讨论】:

  • 是的,它也有效。我之前没有尝试过这样的事情的原因是因为我正在寻找一个更“优雅”的解决方案。谢谢。
  • @Iván:我希望你已经阅读了所有关于为什么混合不是一个好主意的帖子。例如,您的上述组件将导致在每个请求上重新创建 @ViewScoped bean,即使在同一个视图上也是如此。恕我直言,缺点可能胜过“优雅”方面。小心:)。
  • 我已经阅读了几篇关于为什么将 JSTL 包含到 JSF 组件中不是一个好主意的文章。但是我是 JSF 的新手,并且仍然在学习很多关于这个框架的东西。猜猜我会根据您的回复采取纯 JSF 解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多