Пользовательский компонент JSF - PullRequest
0 голосов
/ 08 октября 2018

У меня есть устаревший код, который я собираюсь переписать.Он содержит множество пользовательских компонентов JSF.Большинство из них просто создают поддерево других компонентов (из ядра JSF или других обычаев), когда они находятся в дереве.Так, например, в xhtml у меня есть:

<custom-component atributes...>
    <child-component/>
    <child-component/>
</custom-component>

А затем в PostAddToViewEvent реализация этого компонента делает, например, что-то вроде:

UIComponent rootChildElement = JSFUtil.findAncesstorOfType(this, HtmlForm.class);
List<UIComponent> guiListChildren = this.getChildren();
if (rootChildElement == null) {
    rootChildElement = new HtmlForm();
} else {
    rootChildElement = new UINamingContainer();
}
rootChildElement.getChildren().addAll(this.getChildren());

Но во время отладки я заметил, что когда обрабатывается JSFAJAX-запрос для такого пользовательского компонента, что, даже если дочерние элементы добавляются в созданную форму, они снова создаются на странице XHTML и добавляются снова.Это приводит к тому, что эти дети на самом деле находятся в двух местах дерева при выполнении AJAX.

Забавно, что это работает в JSF 2.0.3, но когда мы захотели перейти на JSF 2.1, что-то перестало работать,потому что командная ссылка в дочерних элементах, которые были источником AJAX, не может быть найдена в дереве, когда ожидается, что это будет.

Я думаю, что возможно сделать то же самое на этапе PreRenderView, но тогда действия выиграют 'не работает, потому что компоненты команд будут созданы слишком поздно.

Как такие компоненты должны быть реализованы:

  • составной компонент
  • тег facelet
  • тег декоратор?
  • что-то еще?

Безопасно ли здесь изменять дерево компонентов?Если у меня есть компонент, который не переназначает дочерние элементы, но добавляет к нему некоторые новые элементы, такие как кнопки команд или другие компоненты?

...