我遇到了一个问题,关于复合组件内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。someevalue == ' someevalue '}或者只是#{1> 0}
我错过了什么,或者这可能只是一些奇怪的错误?我正在运行Tomcat v7.0和JSF2.0
Ok,
我想我知道为什么会这样了:
在将EL传递给"rendered"属性之前,将传递完整的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。
如果有人遇到这个"bug",这是我发现的最方便的"解决方案":
<h:outputStylesheet library="css" name="#{cc.attrs.enabled ? 'mainDark.css' : 'empty.css'}" target="head" />
如果有人知道这个问题的正确解决方案,请随时进一步回复:)
敬上,Christian
编辑:它也可能是,因为css是在复合组件之外呈现的,因此不能计算cc.attrs
我遇到了同样的问题,我希望能够通过属性"theme"为我的组件指定一个主题。不幸的是,"cc.attrs"变量对于"h:outputStyleSheet"组件是不可用的。
我在JSF JIRA中打开了一个问题:https://java.net/jira/browse/javaserverfaces_spec_public - 1195
尝试了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" />
我希望这能帮助到别人。我一直在寻找一个更干净的解决方案;)