簡體   English   中英

如何通過clientId訪問復合組件的兄弟

[英]How to access a composite component's sibling via clientId

我有一個復合組件捆綁一些輸入字段。 該組件將在頁面上多次使用,並包含一個用於復制其他組件的值的按鈕。 為此,我需要通過其clientId訪問其中一個兄弟姐妹作為目標

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

我的問題在於構建此ID。 我有兄弟的名字,我可以確保它與包含復制按鈕的組件位於相同的命名容器中,但我無法控制完整的嵌套層次結構,因此它可能是:form:foo:bar:parent:child或just form:parent:child 所以基本上我想獲得當前復合組件的前綴,但沒有組件自己的ID,然后附加要從中復制的組件的ID。

這與以下問題類似:

但是,這兩個答案都使用了PrimeFaces特有的功能,如@parentwidgetVar ,這些功能不適用於我的項目。

在嘗試使用EL的隱式對象時,我基本上嘗試了與第二個問題的海報相同的東西 - 結果相同: cc.parent.clientId始終為空。 我也試過cc.namingContainer.clientId以及兩者的一些組合,唉 - 沒有成功。 特別是parent沒有按預期工作的事實讓我感到困惑......

那么:是否存在與組件庫無關的方式來訪問包含復合組件命名容器的“路徑”? parent對象應該如何工作,尤其是:我們什么時候可以使用它而什么時候不能使用它?

PS:我正在考慮使用復合的完整clientId,然后使用fn:split修剪其實際ID,但是,如果有更直接的方式,我會樂意使用它。

#{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}

獲取真實UIComponent的客戶端ID。

最終你應該能夠使用以下構造來引用兄弟:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM