我在Mojarra 2.2.13上,我的项目使用PrimeFaces 6.0。
我正在写自己的JSF UIComponent
。它需要位于webapp/resources/js/charts.min.js
中的一些JavaScript。当我使用@ResourceDependency
注释组件时,脚本是渲染:
@ResourceDependency(name = "js/charts.min.js", target = "head")
但是,我并不总是需要将其渲染。因此,我试图从encodeBegin(FacesContext context)
方法中有条件地将组件资源添加到视图根:
if (condition) {
UIOutput js = new UIOutput();
js.setRendererType("javax.faces.resource.Script");
js.getAttributes().put("name", "js/charts.min.js");
context.getViewRoot().addComponentResource(context, js, "head");
writer.startElement("div", null);
writer.writeAttribute("class", "myChart", null);
// ... write chart data
writer.endElement("div");
}
这确实不是渲染脚本( myChart
是渲染)。我的日志中没有错误。有什么想法我可以检查或改进吗?
我也没有PrimeFaces进行了测试(不确定其头部渲染器是否引起了这一点),但结果是相同的。
因此, encodeBegin(FacesContext context)
不是添加资源的正确位置。你在那里太晚了。
我已经将代码移至组件的构造函数,现在添加了脚本。我不是100%这是这样做的最佳位置,但是我也看到了组件库也在构造函数中进行。它也与PrimeFaces一起使用。
另请参见:
- 如何以编程方式将JS和CSS资源添加到< h:head>?