我遇到了一个问题。
我通过c:forEach标记迭代字符串列表来动态生成View
然后通过facelets include标签将其包括在内。
这对于构建布局效果很好,但显示出一些奇怪的行为。
我有一个包含2个标签的primefaces标签视图。
对于第一个标签(最初显示的标签),设置了组件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,但是现在可以了。祝好运!!
关于java - 动态生成 View 时,将忽略JSF组件ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15467658/