Jsf 2 (Primefaces+;JSF)选项卡ajax中出现错误

Jsf 2 (Primefaces+;JSF)选项卡ajax中出现错误,jsf-2,primefaces,Jsf 2,Primefaces,我的代码: <h:form id="form"> <p:tabView dynamic="true" id="tabform" orientation="left"> <p:tab id="tab1" title="Tree"> <p:growl id="messages" showDetail="true" />

我的代码:

<h:form id="form">
            <p:tabView dynamic="true" id="tabform" orientation="left">
                <p:tab id="tab1" title="Tree">
                    <p:growl id="messages" showDetail="true" />
                    <p:panel style="float:left">
                        <p:tree value="#{treeBean.root}" var="node" dynamic="true" cache="false"  
                                selectionMode="single"  selection="#{treeBean.selectedNode}" id="tree" >  
                            <p:ajax event="expand" update=":form:tabform:tab1" listener="#{treeBean.onNodeExpand}" /> 

我有一个错误:


请向我解释原因,感谢您的建议:)

这似乎是
p:ajax
的更新
属性中的错误id问题


查看页面的呈现html源代码并确定选项卡的正确id。可能您在id字符串中遗漏了一个子组件。

您可以使用以下解决方案

可以将要呈现的元素绑定到将存在于请求范围中的hashmap

除了在
render
属性中使用该绑定之外,它听起来可能很复杂,但实际上并非如此

这里有一个例子

通过faces-config.xml将哈希映射放入请求范围:

<managed-bean>
    <description>Holder of all component bindings.</description>
    <managed-bean-name>components</managed-bean-name>
    <managed-bean-class>java.util.HashMap</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

所有组件绑定的持有者。
组件
java.util.HashMap
要求
而不是像这样使用它:

<p:message binding="#{components.myMessage}"></p:message>


最后把它渲染成这样

<p:ajax event="expand" update="#{components.myMessage.clientId}" listener="#{treeBean.onNodeExpand}"></p:ajax>



此解决方案取自BalusC关于如何获取id的旧答案…

它与
update=@form
一起工作吗?是的,它与update=@form:|我不想全部更新,因为表单有许多组件。@user1254072:请将错误复制并粘贴到此处。这样,当图像链接消失时,它仍然存在,并且可以通过搜索找到。id是“:form:tabform:tab1”,正如您看到的id flow:form->tabform->tab1这真的是浏览器中html源的id吗?尾随“:”表示它不是.html源代码:因此id字符串是正确的。因此,从理论上讲,这应该是可行的。如果你更新了整个选项卡怎么办?对不起。如果update=“:form:tabform:tab1”,它将工作。但是update=“:form:tabform:tab1:messages”它报告上面的错误:|我有很多组件,所以我不想更新整个tabview。
<p:ajax event="expand" update="#{components.myMessage.clientId}" listener="#{treeBean.onNodeExpand}"></p:ajax>
<p:ajax event="expand" update="#{components.myTabName.clientId}" listener="#{treeBean.onNodeExpand}"></p:ajax>