获取数据表中更新的单元格 - primefaces - java

get updated cell in datatable - primefaces - java

在我的数据表中有几个字段。我的意图是,当您编辑这些字段中的任何一个并按下按钮时,该行将发送到我的 backbean 以进行更改。

问题是当对象被发送到 Backbean 时,它带有原始属性(值)。

我需要在编辑字段时更新数据表,并将这个新值发送到我的 backbean。

有什么建议吗?另外,我试图避免在我的 backbean 中使用 primefaces...到目前为止我已经做到了..

我的数据表

<h:form id="formBean">
<p:dataTable id="dataTableBean"
             var="modulo" 
             value="#{moduloBean.listModulo}"
             paginator="true"
             rows="15"
             resizableColumns="true">


    <p:column headerText="Id"><h:outputText value="#{modulo.id}"/></p:column>
    <p:column id="columnNmDescricao"
              headerText="Descrição">
        <p:inputText id="inputNmDescricao" value="#{modulo.nmDescricao}">
            <p:ajax event="change"
                    update=":formTabFuncionalidade:tabViewTabFuncionalidade:tabViewAcaoFuncionalidade:formBean:dataTableBean"
                    process="@this :formTabFuncionalidade:tabViewTabFuncionalidade:tabViewAcaoFuncionalidade:formBean:dataTableBean:0:inputNmDescricao"/>
        </p:inputText>
    </p:column>
    <p:column headerText="Ativo"><h:outputText value="#{modulo.ativo.nmAtivo}"/></p:column>

    <!-- Coluna para Ações. Trocar apenas os 2 últimos parâmetros do callSubAcaoMethod -->
    <p:column id="columnAcoes"
              headerText="Ações">
        <c:forEach items="#{funcionalidade.listAcao}"
                   var="subAcao">
            <c:if test="#{!subAcao.tipoAcao.flPrincipal}">
                <p:commandButton id="btnAcoes"
                                 value="#{subAcao.tipoAcao.nmDescricao}"
                                 icon="#{subAcao.tipoAcao.nmIcone}"
                                 action="#{segurancaBean.callSubAcaoMethod(subAcao, moduloBean.class, modulo)}"
                                 process="@this"/>
            </c:if>
        </c:forEach>
    </p:column>
</p:dataTable>  
</h:form>

我调用的SubAcao方法

    public void callSubAcaoMethod(Acao acao, Class bean, Object objeto){
    try {
        /* Método de instanciar um objeto dinamicamente em uso de CDI */
        Object objBean = CDI.current().select(bean).get();

        /* Estou chamando o método do Bean, dando como parâmetro suas ações e a classe que será alterada */
        Method method = bean.getMethod(acao.getTipoAcao().getNmBean(), objeto.getClass());
        method.invoke(objBean, objeto);

    } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
        Logger.getLogger(SegurancaBean.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我要调用的方法

    public void btnAlterar(Modulo entity){
    System.out.println(entity);
    System.out.println(entity.getId());
    System.out.println(entity.getNmDescricao());
    System.out.println(entity.getAtivo().getNmAtivo()); 
}

替换

<p:inputText id="modelInput" value="#{modulo.nmDescricao}" style="width:96%"/>

<p:inputText id="modelInput" value="#{modulo.nmDescricao}" style="width:96%">
<p:ajax event="change" proces="@this :formID:dataTable:modelInput" update=":formID:dataTable"></p:ajax></p:inputText>

您需要使用 ajax 更新模型的新值并使用它更新 table,因此当您将行对象发送到后台时,它是新的值。

使用按钮,您可以像这样将行对象发送到后台 bean 方法 btnAlterar。

<p:commandButton value="#{subAcao.tipoAcao.nmDescricao}"
   icon="#{subAcao.tipoAcao.nmIcone}"
   action="#{WhatEverBeanHasMe.btnAlterar(modulo)}"
   process="@this"
 />