2013-12-20 67 views
2

對於部分更新我的複合組件,我在查找正確的父ID時遇到了一些問題。例如如果我的組件是一個TabView的在複合組件中獲取正確的父ID

<p:tabView id="foo"> 
     <p:tab> 
      <stg:mycomponent id="bar" /> 
     </p:tab> 
</p:tabView> 

裏面現在我需要字符串:foo:bar找到正確的部分,我想更新。通過#{cc.id}我剛剛得到bar,所以這對我不起作用。

不過,我試圖通過某種骯髒的黑客來實現這一由這樣

<composite:attribute 
    name="parentId" 
    default=":#{component.namingContainer.parent.namingContainer.clientId}" 
/> 

添加屬性到我的組件。如果我交出字符串:foo:barparentId一切工作正常,但當然這是不是我真正想做的事情。我不想強迫我的組件的用戶交出這個ID。

但現在的問題:如果我不交出parentId,我只能在我的組件的「第一級」使用我的屬性。如果存在某種「嵌套ID」,則評估例如#{cc.attrs.parentId}。到foo:bar(這很好),但也​​或類似的事情,這取決於#{cc.attrs.parentId}位於我的代碼中。

我希望能夠理解我的問題是什麼以及我所要求的。如果沒有,請留下評論。


我使用primefaces 3.5和JSF 2.1(鑽嘴魚科)

回答

1

如果我明白了,你需要的複合材料部件本身更新複合元件的部分。通常你不需要知道父母的ID就可以達到這個目的。

當您在primefaces組件上設置id時,只要您的更新位於相同範圍內,就可以使用相同id(不含任何:container:etc前綴)的primefaces更新它。

這裏是一個例子(見下面的來源)。

觀察生成的ID在通過JSF在所述第一接線片產生的HTML頁面:

  • 第一跨度:ID = 「靜態」(原始的HTML ID,而不是PF,在文檔中不唯一)
  • 第二個跨度:id =「myform:tv1:comp1:static2」(PF生成以確保id在文檔中是唯一的)
  • 第三個跨度:id =「myform:tv1:comp1:dynamic」獨特)
  • 即使我們僅在源中提供「動態」,輪詢組件也使用id「myform:tv1:comp1:dynamic」。
  • 父母並不需要知道組成部分的ID進行更新
  • 組件並不需要知道其父母的IDS /容器

請注意第二個選項卡上生成的ID 。 PrimeFaces通過將它們命名爲獨特的來完成它的工作。

樣品複合材料部件:

<composite:interface> 
    <composite:attribute name="label" /> 
</composite:interface> 
<composite:implementation> 
    <h1><h:outputText value="#{cc.attrs.label}"/></h1> 
    <span id="static1"> 
     Static : #{testBean.increment} 
    </span> 
    <p:outputPanel id="static2"> 
     Static : #{testBean.increment} 
    </p:outputPanel> 
    <p:outputPanel id="dynamic"> 
     Dynamic : #{testBean.increment} 
    </p:outputPanel> 
    <p:poll interval="3" update="dynamic" /> 
</composite:implementation> 

使用在XHTML頁面的組件:

<h:form id="myform"> 
    <p:tabView id="tv1" > 
     <p:tab id="tab1" title="First Tab"> 
      <comps:myComponent id="comp1" label="Abc" /> 
     </p:tab> 
     <p:tab id="tab2" title="Second Tab"> 
      <comps:myComponent id="comp2" label="Def" /> 
     </p:tab> 
    </p:tabView> 
</h:form> 

這是爲測試豆代碼:

@ManagedBean(name="testBean") 
public class TestBean implements Serializable 
{ 
    static int _counter = 0; 
    public String getIncrement() 
    { 
     _counter++; 
     return Integer.toString(_counter); 
    } 
} 

我希望這個例子能夠清楚並且接近你想得到的。 請讓我知道。

+0

感謝您的回答,但那不是我正在尋找的。我真的需要複合組件內任何地方的完整合格ID。原因是我有多個形式_within_ cc,並且想要更新A形式中的某些部分形式的另一個形式B.我知道這不是「良好的做法」,但通過這種方式,我可以重複使用大量代碼幾行。一切正常 - 唯一的問題是獲得正確的FQ-ID – stg