3

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

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

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

这类似于以下问题:

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

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

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

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

4

1 回答 1

6

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

#{cc.namingContainer}简单地引用自身,完全符合以下#{cc}规定UIComponent#getNamingContainer()

从 "this" 开始,返回祖先中最接近的组件,NamingContainer如果null没有,则返回。

复合组件即隐式实现NamingContainer自己。

因此,不幸的是,您的尝试不会奏效。我也没有看到任何“标准 API”方法来实现具体的功能要求。无法解决的CompositeComponentAttributesELResolver原因是您最终想要的。#{cc.parent}UIComponent#getParent()

但是,您可以UIComponent为组合提供一个自定义实现,它添加一个具有唯一名称的额外 getter,该名称反过来又正确地委托给UIComponent#getParent().

这是一个启动示例:

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

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

}

如果在复合界面注册如下:

<cc:interface componentType="myComposite">

那么你就可以使用

#{cc.parentComponent.clientId}

to get the client ID of the real parent UIComponent.

Ultimately you should be able to use the following construct to refer the sibling:

process=":#{cc.parentComponent.clientId}:siblingId"
于 2012-11-01T18:10:25.997 回答