簡體   English   中英

使用JSF 2.0獲取命名容器內的組件clientId的完整前綴

[英]Acquire full prefix for a component clientId inside naming containers with JSF 2.0

我在JSF中通過AJAX更新組件:

<h:form>
    <h:outputLink>Click me
        <f:ajax event="click" render=":messages" />
    </h:outputLink>
</h:form>

<h:messages id="messages" globalOnly="true" />

作為<h:messages />駐留外面<h:form />我有冒號的前綴ID( : : 這有效。

但是,如果我將相同的代碼放入組件並將該組件包含到我的頁面中,則代碼將失敗。 原因是:messages聲明是指組件層次結構的根,而我想要更新的<h:messages />組件實際上位於我的自定義組件下,該組件位於頁面下(因此位置是樣式的:myComponent:messages

在我的組件內部,如何為<h:messages />組件實現正確的前綴? 我知道我可以手動為我的組件分配ID,並使用它來為引用添加前綴(例如:#{cc.attrs.id}:messages )。 但是,我不知道這個組件位於哪個級別的組件層次結構中,因此所需的前綴可能類似於:foo:bar:x:y:messages

好像你可以通過表達式語言(EL)隱式對象( cccomponent )訪問當前前綴:

  • cc.clientId返回當前復合組件的前綴
  • component.clientId返回任何當前組件的前綴。

例如,在頁面中,通過調用某個組件

<myComponent id="foo">

在這個組件中,可以像這樣獲取客戶端ID:

<h:outputText id="bar">
   <p>ClientId for the composite component: #{cc.clientId}</p>
   <p>ClientId for current any component: #{component.clientId}</p>
</h:outputText>

以下內容應打印為:

ClientId for the composite component: foo
ClientId for current any component: foo:bar

我從博客文章JSF獲得了指針:使用組件標識符(id / clientId) 它聲明這是JSF 2.0的新功能。 在此之前,必須以編程方式從輔助bean中獲取ID。

@Tuukka Mustonen,謝謝你的回答。

如果我們需要從同一個“地方”訪問另一個ID,我們可以使用:

<h:outputScript name="js/my-script.js"/>
<h:form id="myForm">
    <h:inputText id="aaa"
        onkeyup="myJSFunction(this.id)"
        value="..."
    />
    <h:inputText id="bbb"
        onkeyup="myJSFunction(aaa.id)"
        value="..."
    />
    <h:inputText id="ccc"
        onkeyup="myJSFunction('#component.parent.clientId.concat(':ccc')}')"
        value="..."
    />
    <h:inputText id="ddd"
        onkeyup="myJSFunction('#component.parent.clientId.concat(':aaa')}')"
        value="..."
    />
</h:form>

JavaScript函數:

function myJSFunction(message) {
    window.alert(message)
}

對話框窗口輸出:

1)myForm:aaa

2) null

3)myForm:ccc

4)myForm:aaa

注意:所以第1和第3個輸出相同。

暫無
暫無

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

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