动态h:ui:repeat中的outputScript name属性

时间:2013-02-12 11:32:03

标签: jsf jsf-2

我正在使用com.sun.faces版本2.1.18。我正在显示问题列表和一些问题(基于数据库ID)我想插入一些动态Javascripts。

根据h:outputScript tag specificationname属性的类型为:javax.el.ValueExpression(必须评估为java.lang.String)。

但是,这段代码对我有用:

<ui:repeat value="#{js.questionScripts[question.id]}" var="script">
  <h:outputScript name="myScript.js" library="js" target="head"/>
</ui:repeat>

但是这段代码不是:

<ui:repeat value="#{js.questionScripts[question.id]}" var="script">
  <h:outputScript name="#{script}" library="js" target="head"/>
</ui:repeat>

#{question}来自问题列表周围的<ui:repeat>次迭代。

我添加了一个输出,以查看#{script}是否为空,但它包含正确的资源名称。

有关如何解决此问题或实施替代方案的任何想法?

1 个答案:

答案 0 :(得分:3)

必须在视图构建期间创建<h:outputScript>才能被JSF资源管理识别。 <ui:repeat>在视图渲染时运行,因此为时已晚。您必须使用<c:forEach>。我不确定它是如何失败的,但它对我来说很好,前提是#{js}是一个请求,会话或应用程序范围的bean,其questionScripts属性已在其(post)构造期间准备好并且在视图构建期间#{question.id}可用。

<c:forEach items="#{js.questionScripts[question.id]}" var="script">
    <h:outputScript name="js/#{script}" target="head"/>
</c:forEach>

(请注意,您必须使用items属性而非value属性,并注意我修复了看似improper usage of library attribute

另见: