【问题标题】:Can't edit value in datatable using OnRowEdit in PrimeFaces无法使用 PrimeFaces 中的 OnRowEdit 编辑数据表中的值
【发布时间】:2014-12-12 09:18:45
【问题描述】:

我已关注 PrimeFaces 展示以使用行编辑数据表,但我不明白为什么它不更新数据。

这是我的数据表:

<p:dataTable id="tab" var="art" value="#{myMB.allArticles}" editable="true" style="margin-bottom:20px">
   <f:facet name="header">

   </f:facet>

   <p:ajax event="rowEdit" listener="#{myMB.onRowEdit}" update=":form:msgs" />
   <p:ajax event="rowEditCancel" listener="#{myMB.onRowCancel}" update=":form:msgs" />

   <p:column headerText="Name ">
       <p:cellEditor>
           <f:facet name="output"><h:outputText value="#{art.name}" /></f:facet>
           <f:facet name="input"><p:inputText id="modelInput" value="#{art.name}"  style="width:100%"/></f:facet>
       </p:cellEditor>
   </p:column>

   <p:column headerText="Budget">
       <p:cellEditor>
           <f:facet name="output"><h:outputText value="#{art.budget}" /></f:facet>
           <f:facet name="input"><p:inputText value="#{art.budget}" style="width:100%" label="Budget"/></f:facet>
       </p:cellEditor>
   </p:column>
   <p:column style="width:32px">

       <p:rowEditor  />
   </p:column>
  </p:dataTable>

在 bean 中:

public void onRowEdit(RowEditEvent event ) {

    Article f =  (Article) event.getObject();

    formationFacade.update(f);
    FacesMessage msg = new FacesMessage("Article Edited", ((Article) event.getObject()).getName());
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

我已经看到了这个:link,但它对我不起作用我在编辑后得到旧值并且我在 may 数据库中没有任何变化.. 有人可以帮帮我吗?

【问题讨论】:

  • 代码看起来是对的,你检查Article f的值了吗?也许你在formationFacade.update(f); 代码行有错误?
  • 感谢@giaffa86 的回复.. 当我放一个 **System.out.println("budget de la formation :: : "+f.getBudget()); ** 我得到了旧值,我不认为错误出在更新方法中,因为如果我不使用 onRowEdit,它可以正常工作。我迷路了,因为我看不到我的问题在哪里
  • 好的。您是否将 dataTable 包装到 h:form 中?这是我看到的唯一问题。你称你的数据表为“表格”,可能你错了。每个输入组件必须在表单内
  • 是的,我的 dataTable 在 h:form 内...即使我在 inputText 中写了一个新值,它也不会改变任何东西..实际上我与 primefaces 展示的唯一区别是我的 dataTable 填充了数据库中的值列表,而不是静态值列表。我不知道是否应该对这种方法进行任何更改?
  • 如果allArticles被正确设置为bean属性,则静态填充和动态填充没有区别。

标签: jsf jsf-2 primefaces


【解决方案1】:

有一件事是奇怪/错误的,可能是也可能不是您的问题的原因,但我建议您修复。从这个update=":form:msgs" 我假设你有一个封闭的标签,如&lt;h:form id="form"&gt;&lt;p:growl id="msgs"。另一方面,您在&lt;p:dataTable id="form" 中重复id="form"。重复 id 肯定是错误的,但我不确定它是否是您的问题的原因

【讨论】:

  • 感谢您的回答 @Master Slave 是的,我有一个 &lt;h:form id="form"&gt;&lt;p:growl id="msgs" ,我只是更改了数据表的 ID,感谢您的评论,但这不是我问题的原因,因为我仍然无法获得新价值
  • 是的,不过并不惊讶,它仍然是唯一可以立即发现的错误,抱歉没有帮助
【解决方案2】:

首先,您必须为EditMode 参数提供值

CellEdit

或RowEdit 视情况而定。

其次,如果您想要一种简单的方法来编辑数据表,您可以在没有事件的情况下进行编辑

modifyYourModel(Model x){
// call your function to modify 
}

在数据表中,你可以做到这一点

<p:dataTable id="tab" var="art" value="#{myMB.allArticles}" editable="true" EditMode="rowEdit" style="margin-bottom:20px">
   <f:facet name="header">

   </f:facet>

   <p:ajax event="rowEdit" listener="#{myMB.modifyYourModel(art)}" update=":form:msgs" />
   <p:ajax event="rowEditCancel" listener="#{myMB.onRowCancel}" update=":form:msgs" />

【讨论】:

    【解决方案3】:

    使用您的 ID 代替 :form、:msgs。

    <p:ajax event="rowEdit" listener="#{myMB.onRowEdit}" update="messages tab" />
    <p:ajax event="rowEditCancel" listener="#{myMB.onRowCancel}" update="messages tab" />
    

    您还必须通过编辑的对象更新列表“allArticles”。

    【讨论】:

    • :form:msgs IS an id... 这是完整的绝对客户端 id,如果您在组件树中向上更新某些内容,则需要它。所以问题的那部分是好的,因此你的答案的那部分不是。
    • 但这对我不起作用(Primefaces 7.0)。我现在试了一下并回答声音:“javax.servlet.ServletException:找不到从“datatable_id”引用的表达式“:form:msgs”的组件
    • 是的,但是您的页面中没有具有导致此 clientId 的 id 的组件。这并不少见,每个人都选择自己的 id stackoverflow.com/questions/8634156
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2015-10-21
    相关资源
    最近更新 更多