gpt4 book ai didi

jsf - 如何实现 NamingContainer?所有 child 都获得相同的客户 ID

转载 作者:行者123 更新时间:2023-12-01 01:04:54 25 4
gpt4 key购买 nike

我尝试编写自己的树组件。树节点呈现为包含树组件的子组件的 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()只为每个 child 调用一次(不是像我期望的那样为每个迭代和每个 child 调用)。这会导致每个子 ID 都以相同的容器 ID 为前缀:
form:treeid:0:xxx

覆盖也一样 getClientId() .

我错过了什么?

最佳答案

答案隐藏在JSF 1.2 specification的第3.1.6章底部:

3.1.6 Client Identifiers

...

The value returned from this method must be the same throughout the lifetime of the component instance unless setId() is called, in which case it will be recalculated by the next call to getClientId().



换句话说, getClientId() 的结果默认情况下由 JSF 组件缓存,如在 UIComponentBase#getClientId() 中实现的那样(另请参阅 line 275 as it is in Mojarra 1.2_15 处的空检查)并且当 UIComponentBase#setId() 重置此缓存时被调用(另见 line 358 as it is in Mojarra 1.2_15 )。只要您不重置缓存的客户端 ID,它就会在每个 getClientId() 上返回相同的值。称呼。

因此,在渲染 encodeChildren() 中的 child 时您的组件或渲染器的实现很可能是这样的,
for (UIComponent child : getChildren()) {
child.encodeAll(context);
}

你应该为每个 child 打电话 UIComponent#setId() 结果 UIComponent#getId() 在编码 child 之前重置内部缓存的客户端 ID:
for (UIComponent child : getChildren()) {
child.setId(child.getId());
child.encodeAll(context);
}
UIData <h:dataTable>后面的类(class)顺便说一下,实现也是这样做的(见 line 1382 as it is in Mojarra 1.2_15)。请注意,这不是 JSF 1.x 特定的,这同样适用于 JSF 2.x(以及 Facelets UIRepeat 后面的 <ui:repeat> 类)。

关于jsf - 如何实现 NamingContainer?所有 child 都获得相同的客户 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19635720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com