<p:ajax> 无法将 <p:ajax> 附加到非 ClientBehaviorHolder 父级

Posted

技术标签:

【中文标题】<p:ajax> 无法将 <p:ajax> 附加到非 ClientBehaviorHolder 父级【英文标题】:<p:ajax> Unable to attach <p:ajax> to non-ClientBehaviorHolder parent 【发布时间】:2013-11-26 03:47:57 【问题描述】:

我使用 JSF 2,primefaces 4.0,我尝试使用 DataTable - In-Cell Editing,因为它是在 primefaces 展示中生成的,但我有一个错误,尽管我复制了展示中显示的相同示例 错误是

<p:ajax> Unable to attach <p:ajax> to non-ClientBehaviorHolder parent

这是xhtml页面代码

 <rich:panel  style="width : 800px; height : 551px; " > 
     <f:facet name="header" >

<h:outputText value="Tableau des articles" align="center" style="FONT-SIZE: small;"/>
            </f:facet>


    <h:form id="form">

   <p:dataTable id="cars" var="car" value="#articlesbean.LMatpilotaccess1" editable="true" editMode="cell" widgetVar="carsTable">  

        <f:facet name="header">  
            Matériel du pilotage et accessoires 
        </f:facet>  
  <p:growl id="messages" showDetail="true"/>  

    <p:contextMenu for="cars" widgetVar="cMenu">     
        <p:menuitem value="Edit Cell" icon="ui-icon-search" onclick="PF('carsTable').showCellEditor();return false;"/>    
        <p:menuitem value="Hide Menu" icon="ui-icon-close" onclick="PF('cMenu').hide()"/>    
    </p:contextMenu>   


        <p:column headerText="Serie" style="width:25%">  
               <p:ajax event="cellEdit" listenner="#articlesbean.onCellEdit" update=":form:messages" /> 

               <p:cellEditor>  
                   <f:facet name="output"><h:outputText value="#car.serie" /></f:facet>  
                   <f:facet name="input"><p:inputText id="modelInput" value="#car.serie" style="width:96%"/></f:facet>  
               </p:cellEditor>  
           </p:column>  



    </p:dataTable>  


    </h:form>




</rich:panel>

这是我的豆子

@ManagedBean(name="articlesbean")

@ViewScoped
public class ArticlesBean implements Serializable

    @Inject
    private ArticlesDAO articleDAO;
    @Inject
    private Matpilotaccess1 matpilotaccess1;
    @Inject
    private Matpilotaccess2 matpilotaccess2;
    @Inject
    private Poteaux poteaux ;
    @Inject
    private Travgc1 travgc1;
    @Inject
    private Travgc2 travgc2;
    @Inject
    private Travresurbain travresurbain;


    private List LMatpilotaccess1 = new ArrayList();
    private List LMatpilotaccess2 = new ArrayList();
    private List LPoteaux = new ArrayList();
    private List LTravgc1 = new ArrayList();
    private List LTravgc2 = new ArrayList();
    private List LTravresurbain = new ArrayList();




    public void onCellEdit(CellEditEvent event)   
        Object oldValue = event.getOldValue();  
        Object newValue = event.getNewValue();  

        if(newValue != null && !newValue.equals(oldValue))   
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);  
            FacesContext.getCurrentInstance().addMessage(null, msg);  
          
     

    //// Getters and setters

【问题讨论】:

【参考方案1】:

您将&lt;p:ajax&gt; 嵌套在&lt;p:column&gt; 中。 &lt;p:ajax&gt; 需要嵌套在实现ClientBehaviorHolder interface 的组件中。但是,&lt;p:column&gt; 后面的Column component class 并没有实现它。 DataTable component class 后面的 &lt;p:dataTable&gt; 实现了它。

您应该将 &lt;p:ajax&gt; 嵌套在 &lt;p:dataTable&gt; 中:

<p:dataTable ...>
   <p:ajax ... /> 

   <p:column ...>
       ...
   </p:column>
</p:dataTable>

Exactly as demonstrated on their showcase site。换句话说,你的陈述

虽然我复制了展示中显示的相同示例

实际上是不正确的。

【讨论】:

是的,你是对的@BalusC !!!我真的开始注意力不集中了!!再次感谢你!

以上是关于<p:ajax> 无法将 <p:ajax> 附加到非 ClientBehaviorHolder 父级的主要内容,如果未能解决你的问题,请参考以下文章

在 <p:ajax event="cellEdit"> 完成时更新整个 <p:dataTable>

来自 p:ajax 中的侦听器的 InputText 值传递 null 而不是 value

<p:ajax> 监听器永远不会被调用

Primefaces valueChangeListener 或 <p:ajax 侦听器未触发 p:selectOneMenu [重复]

当我单击 p:tree 时如何从 p:ajax 侦听器获取其他组件值

用于 valueChangeListener 的 Ajax