Primefaces DataTable cellEditor - 更新单元格内容

时间:2017-03-17 14:59:47

标签: primefaces datatable cell jsf-2.2

我创建了一个带有可编辑单元格的数据表(组件<p:cellEditor>), 以example为主要参考。

<h:form id="form">
    <p:dataTable id="table" value="#{cars}" var="entity" editable="true" editMode="cell" tableStyle="width:auto">
        <p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" />
        <p:column headerText="Owner">
            <p:cellEditor id="ownerCell">
                <f:facet name="input">
                    <p:selectOneMenu value="#{entity.owner.id}" style="width:100%">
                        <f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.id}" />
                    </p:selectOneMenu>
                </f:facet>
                <f:facet name="output">
                    <h:panelGroup id="ownerOutput"><h:outputText value="#{entity.owner.name}" /></h:panelGroup>
                </f:facet>
            </p:cellEditor>
        </p:column>

我的问题是更新细胞。我可以更改selectOneMenu元素的值,但不更新构面组件输出(id =&#34; ownerOutput&#34;)。我已经检查过,只有当构面输入和输出具有相同的属性值时,即

<p:selectOneMenu value="#{entity.owner.name}" style="width:100%">
    <f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.name}" />

然后代码工作。但我想用id的原始代码。 我试过的其他解决方案没有成功:

  1. 解决方案1:

    <p:ajax event="cellEdit" listener="#{carBean.onCellEdit}" update="table" />
    
  2. 解决方案2:

    public void onCellEdit(CellEditEvent event) {
    Object newValue = event.getNewValue();
    if(newValue != null) {
        int alteredRow = event.getRowIndex();
        String columnName = event.getColumn().getHeaderText();
        FacesContext context = FacesContext.getCurrentInstance();
        Account entity = context.getApplication().evaluateExpressionGet(context, "#{entity}", Car.class);
        entity = service.findAndLoadEntityWithLazyReferencesById(Car.class, entity.getId());
        if(columnName.equals("Owner") {
            entity.setUsername((String) newValue);
        }
    Owner owner = service.findEntityById(Owner.class, (Long) newValue);
            entity.setOwner(owner);
    try {
            service.createOrUpdateEntity(entity);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    if(columnName.equals("Owner") {
            RequestContext.getCurrentInstance().update("form:table:" + String.valueOf(alteredRow) + ":memberCell");
        }
    

1 个答案:

答案 0 :(得分:1)

您的问题不是组件的update,实际上它们已经很好地更新了。 其submit。 选择选项时,不会提交selectOneMenu。 您需要在其中放入一个ajax。 一个简单的<p:ajax/>就可以做到。

<p:selectOneMenu value="#{entity.owner.id}" style="width:100%">
    <f:selectItems value="#{ownerBean.owners}" var="owner" itemLabel="#{owner.name}" itemValue="#{owner.id}" />
    <p:ajax/>
</p:selectOneMenu>