JSF-ресурс (JavaScript) не отображается с использованием addComponentResource

Я нахожусь на Mojarra 2.2.13, и мой проект использует PrimeFaces 6.0.

Я пишу свой собственный JSF UIComponent, Требуется немного JavaScript, расположенный в webapp/resources/js/charts.min.js, Когда я аннотирую свой компонент, используя @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 (не уверен, что это было связано с его головным рендерером), но результат тот же.

1 ответ

Решение

Так, encodeBegin(FacesContext context) не является правильным местом для добавления ресурсов. Вы слишком поздно там.

Я переместил код в конструктор компонента, и теперь скрипт добавлен. Я не на 100%, это лучшее место для этого, но я видел библиотеки компонентов, делающие это и в конструкторе. Это также работает вместе с PrimeFaces.

Смотрите также:

Другие вопросы по тегам