簡體   English   中英

動態生成視圖時,將忽略JSF組件ID

[英]JSF Component IDs ignored when dynamically generating Views

我遇到了一個問題。

我通過c:forEach標記迭代字符串列表,然后通過facelets include標記包括它們來動態生成View。

這對於構建布局效果很好,但顯示出一些奇怪的行為。

我有一個Primefaces Tabview,其中包含2個標簽。 對於第一個選項卡(最初顯示的選項卡),設置了組件ID(例如tabview:categoryTab),但是對於第二個選項卡則不是這種情況,在這里,我只獲取了tabview:組件ID(但實際上應該是tabview:usrTab)

為什么JSF會覆蓋我為第二個Tab設置的ID? 我是否在規范中缺少一些關鍵信息?

我將JSF 2與Primefaces 3.6(快照構建)一起使用(是的,我有意使用快照構建,並且已經使用穩定的PF版本對其進行了測試,但是發生了相同的行為)


編輯

代碼:admin.xhtml

<ui:composition template="/templates/commonLayout.xhtml">
    <ui:define name="content">
        <p:panel id="parentPanel">
            <h:outputText value="Verwaltung" />
            <br />
            <p:tabView id="tabview">
                <!-- insert marker -->
                <c:forEach items="#{adminTabs}" var="tab">
                    <ui:include src="#{tab}" />
                </c:forEach>
            </p:tabView>
        </p:panel>
    </ui:define>
</ui:composition>

catTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="Categories Tab" id="catTab">
            ....
    </p:tab>
</ui:composition>

usrTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="Users Tab" id="usrTab">
            ....
    </p:tab>
</ui:composition>

testTab.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <p:tab title="TestTab" id="testTab">
            ....
    </p:tab>
</ui:composition>

ContentProvider.java

 public class ContentProvider {
    ....

    @Produces
    @Named("adminTabs")
    public List<String> getTabs(){
        List<String> components = new ArrayList<String>();
        components.add("/templates/tabs/catTab.xhtml");
        components.add("/templates/tabs/usrTab.xhtml");
        components.add("/templates/tabs/testTab.xhtml");
        return components;   
    }

    ....

}

這將生成:

<ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" role="tablist">
<li class="ui-state-default ui-tabs-selected ui-state-active ui-corner-top" aria-expanded="true" role="tab">
<a href="#tabview:catTab">Categories</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt31">TestTab</a>
</li>
<li class="ui-state-default ui-corner-top" aria-expanded="false" role="tab">
<a href="#tabview:j_idt32">Benutzer und Rollen</a>
</li>
</ul>

因此,重申一下:盡管保留了第一個選項卡的ID,但是在xhtml代碼中設置了其他選項卡的ID仍會生成...

我遇到了與Richfaces 4和JSF 2非常相似的東西。我設法通過在id屬性中包含EL表達式來解決它。 為了我

<h:form id="staticName"> 

被渲染成

<form id="j_idblah>

但是一旦我做了

<h:form id="#{_objectInContext}">

它開始正確渲染。 很hacky,但現在就可以了。 祝好運!!

在包含帶有ac:forEach循環的facelets時,我遇到了同樣的問題。

對我有用的是將ID指定為EL-Constants:id =“#{'address_street'}”

暫無
暫無

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

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