JSF 资源 (JavaScript) 未使用 addComponentResource 呈现

JSF resource (JavaScript) not rendered using addComponentResource

我使用的是 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 一起使用。

另请参阅:

  • How to programmatically add JS and CSS resources to <h:head>?