在复合内部评估h:outputStylesheet的“rendered”属性

时间:2011-09-12 10:17:19

标签: jsf jsf-2 composite-component

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

<h:outputStylesheet rendered="#{cc.attrs.value == 'somevalue'}" library="css" name="mainDark.css" target="head" />
即使EL评估为'true',

也不起作用。而

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

正在正确渲染/不渲染。

虽然这已经令人困惑,但情况更糟:

  • 如果我用'true'或'false'替换EL,则该属性按预期工作。
  • 如果我通过其他评估取代EL也可以。例如#{someBean.somevalue =='somevalue'}或仅#{1&gt; 0}

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

3 个答案:

答案 0 :(得分:2)

确定,

我想我发现了,为什么会发生这种情况:

在将EL传递给“呈现”属性之前,不是评估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" />
无论如何,

将在组件内被评估为'false'。

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

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

如果有人知道这个问题的正确解决方案,请随时回复:)

致以最诚挚的问候,Christian

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

尝试使用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" />

我希望这有助于某人。我总是愿意接受更清洁的解决方案;)