我尝试编写自己的树组件。树节点呈现为包含树组件的子组件的 div,例如:
<my:tree id="extendedTree"
value="#{controller.rootNode}"
var="node">
<h:outputText id="xxx" value="#{node.name}" />
<h:commandLink value="Test" actionListener="#{controller.nodeSelectionActionListener}" />
</my:tree>
到目前为止,一切都很好 - 一切都按预期工作,但h:outputText
重复获得相同的 id。
所以我让我的组件实现javax.faces.NamingController
,覆盖getContainerClientId()
:
@Override
public String getContainerClientId(FacesContext context) {
String clientId = super.getClientId(context);
String containerClientId = clientId + ":" + index;
return containerClientId;
}
index
在节点迭代期间设置和更新。但是getContainerClientId()
每个孩子只调用一次(而不是每个迭代和每个孩子,如我所料)。这会导致每个子 id 都以相同的容器 id 为前缀:
form:treeid:0:xxx
覆盖也是一样getClientId()
。
我错过了什么?