У меня есть устаревший код, который я собираюсь переписать.Он содержит множество пользовательских компонентов 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
- тег декоратор?
- что-то еще?
Безопасно ли здесь изменять дерево компонентов?Если у меня есть компонент, который не переназначает дочерние элементы, но добавляет к нему некоторые новые элементы, такие как кнопки команд или другие компоненты?