我有一个将要重写的旧代码。它包含许多自定义的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());
但是在调试过程中,我注意到JSF处理针对此类自定义组件的AJAX请求时,即使将子级添加到创建的表单中,也将从XHTML页面中再次构建子级,然后再次添加。这导致执行AJAX时,这些孩子实际上位于树中的两个位置。
这在JSF 2.0.3中有效,但是当我们想升级到JSF 2.1时,它却停止了工作,因为预期在树中找不到作为AJAX源的子代中的命令链接成为。
我认为应该可以在PreRenderView阶段执行相同的操作,但是随后动作将不起作用,因为命令组件创建得太晚了。
这些组件应如何实现:
在这里修改组件树是否安全?如果我有一个组件,那不会重新分配子组件,而是向其自身添加一些新项,例如命令按钮或其他组件?