2013-01-09 27 views
1

在我的情況下,我想刷新ID爲baseTab的組件。它本身包含如果形式main和tabView tabs。對組件的絕對引用是main:tabs:baseTab。而這也正是我需要參考例如在更新屬性:如何使用唯一標識定位特定的JSF組件?

<p:commandButton update="main:tabs:baseTab"/> 

這樣的全ID的問題是,它是漫長的,可當我改變在組件層次的東西被輕易改變。 ID baseTab本身是獨特的,所以我應該至少在理論上能夠直接引用這個組件。但我怎麼能做到這一點?

通過唯一ID引用組件的語法是什麼?我已經試過如下:

  • :baseTab
  • baseTab
  • 主:baseTab
  • :標籤:baseTab

,沒有那是工作,每個造成此頁面錯誤,這種組件不存在....

+0

可能的重複[如何在JSF ajax中引用組件?在視圖中找不到標識符爲「foo」的組件(http://stackoverflow.com/a/8644762)。你需要':main:tabs:baseTab'。 – BalusC

+0

您只能通過ID直接引用組件,它們必須至少具有相同的父表單。我想這會對性能產生一定的影響,但Dom處理器必須通過DOM樹對id進行梳理,而不是直接引用 – kolossus

+0

DOM性能沒有任何關係。整個jQuery基於DOM搜索,並且通過ID進行搜索,無論是否獨特,都是極快的操作。 –

回答

2

我可以看到不使這個引用取決於組件樹結構的值。

應該可能利用組件綁定爲此,因爲update可以採取ValueExpression

使用(例如)一個faces-config.xml中定義在請求範圍的地圖:

<managed-bean> 
    <managed-bean-name>bind</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

結合靶到地圖:

<h:foo binding="#{bind.someIdForBinding}" /> 

參考在此控制中的客戶端標識符的按鈕:

<p:commandButton update=":#{bind.someIdForBinding.clientId}"/> 

當樹是crea時,目標組件將被放入綁定映射中泰德/恢復。

請注意,此代碼未經測試。

+0

這是一個有趣的方法,但它只需要創建bean來存儲綁定。它不會使參考文件變短,但是當組件結構非常深並且非常動態時,這是不可避免的。 –

+0

McDowell,'update'屬性仍然需要以':'作爲前綴以使其成爲絕對的。它不是客戶端ID的一部分。 – BalusC

+0

@BalusC啊。修訂;再次,不知道這是否在實踐中有效。 – McDowell

0

不要以爲這是可能的,除非你的組件是在同一個父母。