我正在使用com.sun.faces
版本2.1.18
。我正在显示问题列表,对于某些问题(基于数据库 ID),我想插入一些动态 Javascript。
根据 h:outputScript
tag specification name
属性的类型为: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}
不为空,但它包含正确的资源名称。
关于如何解决这个问题或实现替代方案有什么想法吗?
最佳答案
<h:outputScript>
必须在 View 构建时创建才能被 JSF 资源管理识别。 <ui:repeat>
在 View 渲染时间期间运行,因此为时已晚。您必须使用<c:forEach>
。我不确定它对你来说是如何失败的,但它对我来说效果很好,前提是 #{js}
是请求、 session 或应用程序范围的 bean,其 questionScripts
属性(property)在其(后)施工期间已经准备好,并且 #{question.id}
在 View 构建期间可用。
<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 的问题)。
另请参阅:
关于jsf - 动态h :outputScript name attribute in ui:repeat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14831545/