3

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

根据h:outputScript标签规范,该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}不为空,但它包含正确的资源名称。

关于如何解决这个问题或实施替代方案的任何想法?

4

1 回答 1

3

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

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

(请注意,您必须使用items属性而不是value属性,还请注意,我修复了属性看似不当的使用library

也可以看看:

于 2013-02-12T14:20:00.507 回答