【问题标题】:Updating row on complete of <p:ajax event="cellEdit">在 <p:ajax event="cellEdit"> 完成时更新行
【发布时间】:2017-05-19 17:47:04
【问题描述】:

我想更新同一行中的 cellValue。 我遵循了 BalusC 的建议 Updating entire <p:dataTable> on complete of <p:ajax event="cellEdit">

毕竟我的代码执行了 2 个请求。第二个使整页重新加载,所有数据都将重置。

我也按照这个建议尝试了&lt;p:remoteCommand name="updateTable" process="@this" update="kAbnrTbl" /&gt;Using a p:remoteCommand to update a p:dataTable

这里是 JSF 页面:

<h:form id="kalkEditForm">
        <p:outputPanel id="dropArea">
            <p:remoteCommand name="updateTable" update="kAbnrTbl" />
            <p:dataTable id="kAbnrTbl" value="#{tableBean.data}" var="data" editable="true" editMode="cell">

                <p:ajax event="cellEdit"  listener="#{tableBean.onCellEdit}" oncomplete="updateTable()"/> 

                <p:column headerText="Col1">  
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{data.col1}" /></f:facet>
                        <f:facet name="input"><p:inputText value="#{data.col1}" /></f:facet>
                    </p:cellEditor> 
                    </p:column>

                <p:column headerText="Col2">
                    <h:outputText value="#{data.col2}" />
                </p:column>
           </p:dataTable>   
        </p:outputPanel>
</h:form>

这里是 Bean:

    @ManagedBean(name="tableBean")
    @ViewScoped
    public class TableBean {

    public TableBean() {
        RowData entry = new RowData("a1", "b1");
        entries.add(entry);
        entry = new RowData("a2", "b2");
        entries.add(entry);
        entry = new RowData("a3", "b3");
        entries.add(entry);
    }
public class RowData {

    private String col1;
    private String col2;

    public RowData(String col1, String col2) {
        this.col1 = col1;
        this.col2 = col2;
    }

    public String getCol1() {
        return col1;
    }

    public void setCol1(String col1) {
        this.col1 = col1;
    }

    public String getCol2() {
        return col2;
    }

    public void setCol2(String col2) {
        this.col2 = col2;
    }
}

private final ArrayList<RowData> entries = new ArrayList<RowData>();

public List<RowData> getData() {
    return entries;
}

public void onCellEdit(CellEditEvent event) {
    final DataTable dataTable = (DataTable)event.getComponent();
    RowData data = (RowData) dataTable.getRowData();
    data.setCol2("changed");
  }

}

我不知道代码有什么问题。为什么要执行&lt;p:remoteCommand ...第二个Request。

使用:Primface 5.3

回到起点。如果我不使用&lt;p:remoteCommand name="updateTable" update="kAbnrTbl" /&gt; hack,它可以正常工作,但我必须按下刷新按钮。 如果我使用 hack 我有 2 个请求和一个完整的页面重新加载。一定有一个小错字或我忽略的东西。

这里是没有 hack 的代码。

<h:form id="kalkEditForm">
        <p:outputPanel id="dropArea">
            <!-- <p:remoteCommand name="updateTable" update="kAbnrTbl" /> -->
            <p:dataTable id="kAbnrTbl" value="#{tableBean.data}" var="data" editable="true" editMode="cell">
                <p:ajax event="cellEdit"  listener="#{tableBean.onCellEdit}" update="kAbnrTbl"/>
                <!-- <p:ajax event="cellEdit"  listener="#{tableBean.onCellEdit}" oncomplete="updateTable()"/> -->
                <p:column headerText="Col1">
                    <p:cellEditor>
                        <f:facet name="output"><h:outputText value="#{data.col1}" /></f:facet>
                        <f:facet name="input"><p:inputText value="#{data.col1}" /></f:facet>
                    </p:cellEditor>  
                </p:column>
                <p:column headerText="Col2">
                    <h:outputText value="#{data.col2}" />
                </p:column>
           </p:dataTable>   
        </p:outputPanel>
         <p:commandButton id="refreshButton" value="Redisplay" update="kAbnrTbl" />
    </h:form>

【问题讨论】:

    标签: jsf primefaces datatable tablecelleditor remotecommand


    【解决方案1】:

    我使用了 event="rowEdit",这对我有用。

    <p:ajax event="rowEdit" listener="#{tableBean.onCellEdit}" oncomplete="updateTable()" />
    

    【讨论】:

    • 这是我想要避免的。我想知道为什么 remoteCommand 会导致整个页面重新加载。
    • 我们的客户 dont like the pencil and dont 想点击 2 次。所以 cellEdit 是首选。我尝试了您的建议,但未调用侦听器 tableBean.onCellEdit
    • 在另一个页面中,我使用 p:inplace 来更新单元格值。
      &lt;p:inplace&gt; &lt;f:facet name="output"&gt; &lt;h:outputText value="#{_task.status.label }"/&gt; &lt;/f:facet&gt; &lt;f:facet name="input"&gt; &lt;h:selectOneMenu hideNoSelectionOption="false" value="#{_task.status}" &lt;f:selectItems value="#{factoryEnum.enumStatusTask}" var="_enumStatusTask" itemValue="#{_enumStatusTask}" /&gt; &lt;p:ajax process="@this" onsuccess="filter();" listener="#{monitorController.updateTask(_task)}"/&gt; &lt;/h:selectOneMenu&gt; &lt;/f:facet&gt; &lt;/p:inplace&gt;
    • 更新当前单元格值不是问题。在另一列中显示更新的单元格值是问题所在。该表未更新。
    • 我尝试使用 也遇到了问题。当我将 一起使用时,我成功了。
    【解决方案2】:

    根据 user3821232 的说明,解决方法是与标准 &lt;p:ajax.. 调用结合使用,而不是“celleditor”“inplace”。

    您可以在此处查看解决方法。

    xthml:

    <h:form id="kalkEditForm">
            <p:outputPanel id="dropArea">
                <p:dataTable id="kAbnrTbl" value="#{tableBean.data}" var="data" editable="true" editMode="cell" rowIndexVar="row">
                    <p:column headerText="Col1" id="col1" sortBy="#{data.col1}" sortable="true">
                        <p:inplace>
                            <f:facet name="output"><h:outputText value="#{data.col1}" /></f:facet>
                            <f:facet name="input">
                                <p:inputText value="#{data.col1}" > 
                                    <p:ajax event="blur" process="@this" listener="#{tableBean.updateData(row, 'col1')}" update="kAbnrTbl"/>
                                </p:inputText>  
                            </f:facet>
                        </p:inplace>
                    </p:column>
                    <p:column headerText="Col2">
                        <h:outputText id="col2" value="#{data.col2}" />
                    </p:column>
               </p:dataTable>   
            </p:outputPanel>
        </h:form>
    

    豆子:

    @ManagedBean(name="tableBean")
    @ViewScoped
    public class TableBean {
    
    private static final Logger logger = Logger.getLogger(TableBean.class);
    
    public TableBean() {
        RowData entry = new RowData("a1", "b1");
        entries.add(entry);
        entry = new RowData("a2", "b2");
        entries.add(entry);
        entry = new RowData("a3", "b3");
        entries.add(entry);
    }
    
    public class RowData {
        private String col1;
        private String col2;
    
        public RowData(String col1, String col2) {
            this.col1 = col1;
            this.col2 = col2;
        }
    
        public String getCol1() {
            return col1;
        }
    
        public void setCol1(String col1) {
            this.col1 = col1;
        }
    
        public String getCol2() {
            return col2;
        }
    
        public void setCol2(String col2) {
            this.col2 = col2;
        }
    }
    
    private final ArrayList<RowData> entries = new ArrayList<RowData>();
    
    public List<RowData> getData() {
        return entries;
    }
    
    public void updateData(Integer row, String colName){
        logger.debug(String.format("updateData called row:%d colName %s", row, colName));
        RowData data = getData().get(row);
        data.setCol2("changed");
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2013-11-02
      • 2014-03-29
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2018-05-13
      • 2015-01-19
      相关资源
      最近更新 更多