2011-09-12 34 views
1

我有一个问题,关于我的复合组件中h:outputStylesheet的“呈现”属性。评估h:outputStylesheet在复合内部的“呈现”属性

<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。
  • 如果我用一些其他评估替代EL,它也可以。例如#{someBean.somevalue =='somevalue'}或者只是#{1> 0}

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

+0

我目前的解决方法:''但是我仍然会感兴趣,为什么会发生这种情况。 –

+0

这不是一个自定义组件。这是一个复合组件。我编辑了标题和标签。然而,有趣的问题。您使用的是JSF impl/version? – BalusC

+0

噢,对不起为:)我使用钻嘴鱼科JSF实现2.0.3 –

回答

2

好运行,

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

相反的评价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。

0

试图与JSF钻嘴鱼科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" /> 

我希望这可以帮助别人。我总是打开一个清洁的解决方案;)