簡體   English   中英

獲取命名容器中組件的真實ID的更好方法

[英]A better way to get the real ID of an component in a naming container

我得到了以下場景:我有幾個選項卡(TabView是一個命名容器),其中一個我得到了ap:inputText,它顯示了一個對話框(位於其他xhtml文件中),現在我希望對話框更新p :inputText,問題是p:inputText的id是unknow(JSF為它添加了一些前綴)

<h:form id="hoursReportFrm">
    <p:inputText id="comment4Dialog" value="#{hoursReportBean.aComment}" 
onfocus="dlg1.show();"/>

我無法在對話框中使用此update =“hoursReportFrm:comment4Dialog”

ATM我看了這個網站JSF的例子:使用組件ID(id vs clientId) (從2009年開始)

並添加了對inputtext的綁定,比如這個binding="#{lookup.components.comment4Dialog}"並在對話框的p:commandButton中我改為update="#{lookup.clientIds.comment4Dialog}"

它工作正常,但我正在尋找一種更好的方法,而不需要綁定我以后想要訪問的每個組件...

謝謝你,

說實話,我認為綁定可能是最簡單的路徑,但是當我遇到這種情況時,我發現復合組件通常提供比綁定更好的解決方案。 根據具體情況(以及完全不同的情況),您可以使用復合組件來解決此問題。 這允許您創造性地重用頁面的某些部分,以便您的特定更新不需要大量工作,您可以重用代碼。

一個例子可能是:

//comp:myDialog
...
<composite:interface>
  <composite:attribute name="update" />
  <!-- Other attributes -->
</composite:interface>

<composite:implementation>
  ...
  <!-- Implementation -->
  <p:commandButton update="#{cc.attrs.update}"/>
  ...
</composite:implementation>

這里可能是正在使用的組件:

//for the sake of argument 'comp' as your library
<h:form id="someForm">
  <p:inputText value="#{bean.changeMe}" id="changeMe"/>
</h:form>

<h:form id="dialog">
  <!-- dialog here -->
  <comp:myDialog update="someForm:changeMe" />
</h:form>

通過將此視圖分成一段可重用的代碼,您可以解決指定完整路徑的負擔,因為它現在更容易重用。 但是,根據具體情況,我認為這是綁定或復合組件的折騰。 要重用,請創建一個新對象(組件)並重用它。 如果您正在處理高度動態的環境:綁定它。

我無論如何都不是專家,但總的來說,上面讓我擺脫了很多困難局面。

編輯:在重新閱讀時,您還應該確保選項卡視圖沒有延遲加載並查看渲染以確保路徑正確(檢查ID)。 我遇到了問題(在Primefaces的舊版本中),有時id嵌套在ap:outputPanel內,或者在極少數情況下嵌套在subview id中。 通過指定完整路徑':subview:form:component'可能是一個非常簡單的修復,但情況並非如此。

暫無
暫無

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

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