gpt4 book ai didi

jsf - 如何通过 clientId 访问复合组件的兄弟

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

我有一个组合组件,它捆绑了一些输入字段。该组件将在页面上多次使用,并包含一个按钮,用于复制其中另一个组件的值。为此,我需要通过其 clientId 访问其中一个 sibling 作为

的目标

<f:ajax execute=":XXX:siblingId" render="...">

我的问题在于构造这个 ID。我有 sibling 的名字,我可以确保它与包含复制按钮的组件位于同一个命名容器中,但我无法控制完整的嵌套层次结构,所以它可能是 :form:foo:bar:parent:child或者只是 form:parent:child .所以基本上我想获取当前复合组件的前缀,但没有组件自己的 ID,然后附加要从中复制的组件的 ID。

这类似于这些问题:

但是,这两个答案都使用了 PrimeFaces 特定功能,例如 @parentwidgetVar ,这不适用于我的项目。

在试验 EL 的隐式对象时,我基本上尝试了与第二个问题的海报相同的东西 - 结果相同:cc.parent.clientId总是空的。我也试过cc.namingContainer.clientId以及两者的一些组合,唉 - 没有成功。尤其是 parent没有按预期工作让我感到困惑......

那么:是否有一种与组件库无关的方法来访问包含复合组件命名容器的“路径”? parent怎么样了对象应该工作,特别是:我们什么时候可以使用它,什么时候不能?

PS:我正在考虑使用复合 Material 的完整 clientId,然后使用 fn:split 修剪其实际 ID ,但是,如果有更直接的方法,我会很乐意使用它。

最佳答案

#{cc.parent} 解析为 UIComponent#getCompositeComponentParent()它返回最近的父复合组件。换句话说,当复合组件本身嵌套在另一个复合组件中时,它仅返回非 null

#{cc.namingContainer} 只是指 #{cc} 本身,完全符合 UIComponent#getNamingContainer() 中的规定。 :

Starting with "this", return the closest component in the ancestry that is a NamingContainer or null if none can be found.

复合组件本身隐式实现了NamingContainer

所以很遗憾,您的尝试是行不通的。我也没有看到任何“标准 API”方法来实现具体的功能需求。 CompositeComponentAttributesELResolver 导致 #{cc.parent} 未解析为 UIComponent#getParent()这就是您最终想要的。

但是,您可以为复合 Material 提供一个自定义的 UIComponent 实现,它会添加一个具有唯一名称的额外 getter,然后正确地委托(delegate)给 UIComponent#getParent()

这是一个启动示例:

@FacesComponent("myComposite")
public class MyComposite extends UINamingContainer {

public UIComponent getParentComponent() {
return super.getParent();
}

}

如果在复合接口(interface)中注册如下:

<cc:interface componentType="myComposite">

然后你就可以使用了

#{cc.parentComponent.clientId}

获取真实UIComponent 的客户端ID。

最终您应该能够使用以下结构来引用 sibling :

process=":#{cc.parentComponent.clientId}:siblingId"

关于jsf - 如何通过 clientId 访问复合组件的兄弟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175512/

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