【问题标题】:Evaluating the "rendered" attribute of h:outputStylesheet inside a composite评估复合材料中 h:outputStylesheet 的“rendered”属性
【发布时间】:2011-09-12 10:17:19
【问题描述】:

我遇到了一个问题,涉及我的复合组件中 h:outputStylesheet 的“rendered”属性。

<h:outputStylesheet rendered="#{cc.attrs.value == 'somevalue'}" library="css" name="mainDark.css" target="head" />

不起作用,即使 EL 评估为“真”。而

<h:outputText rendered="#{cc.attrs.value == 'somevalue'}" value="rendered = true" style="color: red;" />

正在正确渲染/未渲染。

虽然这已经很令人困惑,但它变得更糟:

  • 如果我将 EL 替换为“true”或“false”,该属性将按预期工作。
  • 如果我用其他评估替换 EL,它也可以工作。例如 #{someBean.somevalue == 'somevalue'} 或只是 #{1 > 0}

我是否遗漏了什么,或者这可能只是一些奇怪的错误? 我在 Tomcat v7.0 和 JSF2.0 上运行

【问题讨论】:

  • 我目前的解决方法:&lt;h:outputStylesheet library="css" name="#{cc.attrs.enable == 'true' ? 'mainDark.css' : 'empty.css'}" target="head" /&gt; 但我仍然很感兴趣,为什么会这样。
  • 这不是自定义组件。那是一个复合组件。我编辑了标题和标签。还是很有趣的问题。你使用的是什么 JSF impl/version?
  • 抱歉 :) 我正在使用 Mojarra JSF Implementation 2.0.3
  • 刚试过 Mojarra 2.1.3。还是一样。

标签: jsf jsf-2 composite-component


【解决方案1】:

好的,

我想我找到了,为什么会这样:

在将 EL 传递到“rendered”属性之前,不评估 EL,而是传递完整的 EL。 由于组件 outputSytylesheet 不知道 cc.attrs 它总是将其评估为 false。

所以

<h:outputStylesheet rendered="#{someBean.somevalue == 'somevalue'}" library="css" name="mainDark.css" target="head" />

<h:outputStylesheet rendered="#{2 gt 1}" library="css" name="mainDark.css" target="head" />

有效,因为它可以被评估。而

<h:outputStylesheet rendered="#{cc.attrs.somevalue == 'somevalue'}" library="css" name="mainDark.css" target="head" />

在组件内总是会被评估为“假”。

如果其他人遇到这个“错误”,这是我找到的最方便的“解决方案”:

<h:outputStylesheet library="css" name="#{cc.attrs.enabled ? 'mainDark.css' : 'empty.css'}" target="head" />

如果有人知道此问题的适当解决方案,请随时进一步回复:)

最好的问候,克里斯蒂安

编辑:也可能是,因为 css 在复合组件之外呈现,因此无法评估 cc.attrs。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我希望能够通过属性“theme”为我的组件指定一个主题。不幸的是,“h:outputStyleSheet”组件不能使用“cc.attrs”变量。

    我在 JSF JIRA 中打开了一个问题: https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1195

    【讨论】:

      【解决方案3】:

      尝试使用 JSF Mojarra 2.2.1 这个解决方案没有成功:

      <h:outputStylesheet library="css" name="#{cc.attrs.enabled ? 'mainDark.css' : 'empty.css'}" target="head" />
      

      现在我找到了成功处理此评估问题的解决方法:

      <link rel="stylesheet" type="text/css" href="#{request.requestURL.substring(0, request.requestURL.length() - request.requestURI.length())}#{request.contextPath}/javax.faces.resource/#{cc.attrs.includeStyle ? 'style.css' : 'empty.css'}.html?ln=libraryName" />
      

      我希望这对某人有所帮助。我总是愿意寻求更清洁的解决方案;)

      【讨论】:

        猜你喜欢
        • 2017-09-26
        • 2011-09-16
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 2013-07-02
        • 2012-02-25
        相关资源
        最近更新 更多