我有一个包含三个标签的标签视图。选项卡视图似乎在前两个选项卡更改中正常工作,但在第三个选项卡上我得到一个空指针,如
java.lang.NullPointerException
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:59)
此外,TabChangeEvents此时具有空数据。
使标签的内容最小(只是一行文本),我可以看到标签的内容相互附加。一旦发生这种情况,问题就会开始。
查看PrimeFaces source code,似乎是在尝试使用生成的tabToLoad
检索的tabClientId
变量时。我不确定它是否应该在处理新标签的逻辑分支中。
我的标签视图如下所示:
<p:tabView styleClass="entities-tabview" id="tabs" dynamic="true">
<p:ajax event="tabChange" listener="#{action.onTabChange}"
update="first-tab,second-tab"/>
<p:tab title="First Tab" id="first-tab">
tab one content
</p:tab>
<p:tab title="Second Tab" id="second-tab">
tab two content
</p:tab>
<p:tab title="Other Tab" id="other-tab">
// tab content
</p:tab>
</p:tabView>
代码检查是否在TabView上设置了var
参数。因为我们不使用它,所以它是null,所以它进入新的tab分支。 Tab键索引在tabview上设置。关于什么可能出错的任何想法?
经过一些调查后,我发现在选项卡上更改了应该更改的选项卡是通过请求参数指定的,其中附加了_newTab
的客户端ID。前两次设置正确,但在更改回选项卡时未设置,因此无法找到选项卡和后续的NPE。
更新原因 如果选项卡是动态的,并且ajax事件触发,则更改选项卡,然后ajax更新选项卡。这似乎导致两个选项卡都加载到同一选项卡中的问题,这很可能在以后搞乱参数。
但是如何能够进行标签更改功能并在标签中显示其详细信息?
答案 0 :(得分:5)
这里的问题是你有更新两个标签的ajax。 看来,当它执行此操作时,选项卡的状态会变得混乱,您最终会将两个选项卡的内容合二为一。
您可以将内容插入h:panelGroup
并更新panelgroup
而不是标签
以下示例
<p:tabView styleClass="entities-tabview" id="tabs" dynamic="true">
<p:ajax event="tabChange" listener="#{action.onTabChange}"
update="one-content,two-content,other-content"/>
<p:tab title="First Tab" id="first-tab">
<h:panelGroup display="block" id="one-content">
tab one content
</h:panelGroup>
</p:tab>
<p:tab title="Second Tab" id="second-tab">
<h:panelGroup display="block" id="two-content">
tab two content
</h:panelGroup>
</p:tab>
<p:tab title="Other Tab" id="other-tab">
<h:panelGroup display="block" id="other-content">
// tab content
</h:panelGroup>
</p:tab>
</p:tabView>