2015-12-14 45 views
3

在JSF中,我需要檢查一個組件是否在名稱爲"foo"的方面。我已經寫了下面的代碼來測試組件是小內:如何確定組件是否在某個方面?

boolean insideFacet = false; 
UIComponent parent = uiComponent.getParent(); 

if (parent != null) { 

    UIComponent grandparent = parent.getParent(); 

    if (grandparent != null) { 

     UIComponent facet = grandparent.getFacet("foo"); 

     if (facet != null && facet.equals(parent)) { 
      insideFacet = true; 
     } 
    } 
} 

此代碼工作正常(即insideFacet等於true)時,有在f:facet內的多個標籤:

<example:container> 
    <f:facet name="foo"> 
     <example:componentInFacet /> 
     <h:outputText value="text" /> 
    </f:facet> 
</example:container> 

但是,insideFacet等於falsef:facet內只有一個組件時:

<example:container> 
    <f:facet name="foo"> 
     <example:componentInFacet /> 
    </f:facet> 
</example:container> 

我錯過了什麼?

回答

3

mojarramyfaces --- JSF的兩種實現方式的源代碼---當只有一個部件是面內,該組件小面。所以,你需要修改代碼以檢查的方面是,像這樣的組件:

UIComponent facet = parent.getFacet("foo"); 

if (facet != null && facet.equals(uiComponent)) { 
    insideFacet = true; 
} 

與您的代碼把它們一起:

boolean insideFacet = false; 
UIComponent parent = uiComponent.getParent(); 

if (parent != null) { 

    UIComponent facet = parent.getFacet("foo"); 

    if (facet != null && facet.equals(uiComponent)) { 
     insideFacet = true; 
    } 
    else { 

     UIComponent grandparent = parent.getParent(); 

     if (grandparent != null) { 

      UIComponent facet = grandparent.getFacet("foo"); 

      if (facet != null && facet.equals(parent)) { 
       insidefacet = true; 
      } 
     } 
    } 
} 

注:好像the JSF spec要求將第一個添加到構面的構件命名爲構面(請參見:第9.2.3節)。我似乎無法找到任何關於實現如何處理一個方面中的多個組件的規範語言。我認爲無論如何依靠這種行爲是安全的,因爲自從JSF 2.0以來它沒有改變,並且在兩個JSF實現中都是相同的。如果有人發現指定實現如何處理JSF規範中方面的多個組件的信息,請發表評論,並將其添加到我的答案中。

注2:我還沒有在複合元件上測試過這種方法,所以可能無法工作。

相關問題