1

我遇到了一个问题,关于我的复合组件中 ah: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 上运行

4

3 回答 3

2

好的,

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

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

所以

<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。

于 2011-09-14T07:58:45.217 回答
0

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

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

于 2013-05-24T20:19:52.007 回答
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" />

我希望这可以帮助别人。我总是愿意寻求更清洁的解决方案;)

于 2015-09-03T20:44:34.817 回答