ui中的动态h:outputScript名称属性:repeat



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

根据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}是否为空,但它包含正确的资源名称。

关于如何解决这个问题或实施替代方案,有什么想法吗?

<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属性看似不正确的用法)

另请参阅:

  • JSF2 Facelets中的JSTL。。。有道理吗

相关内容

  • 没有找到相关文章

最新更新