在另一个单元的cellEdit事件上调用ajax后,无法更新p:datatable单元格

时间:2015-12-10 10:02:41

标签: ajax jsf primefaces datatable

在我的支持bean中的单元格编辑事件中,如果单元格值已更改,我想更新另一列的值以及数据表。该值在我的列表对象中正确设置,但没有反映在我的数据表中。我也尝试使用RequestContext使用数据表进行更新,但是列表仍然没有刷新。我究竟做错了什么?我是否应该为此更改调用任何行事件?

代码段:

@Named("editView")
@ViewScoped

public class EditTableView implements Serializable {


    private List<Cars> carList;
    private List<String> brands;

    @PostConstruct
    public void init() {

        brands = new ArrayList<String>();
        brands.add("BMW");
        brands.add( "Mercedes");
        brands.add("Volvo");
        brands.add("Audi");
        brands.add("Renault");
        brands.add("Fiat");
        brands.add("Volkswagen");
        brands.add("Honda");
        brands.add("Jaguar");
        brands.add( "Ford");
        brands.add("Maruti Suzuki");

        carList = new ArrayList<Cars>();
        modifiedList = new ArrayList<Cars>();
        Cars car =new Cars();
        car.setCarId(1);
        car.setBrand("BMW");
        car.setColor("Grey");
        car.setModelNumber("2323");
        car.setSelfDriven("Y");
        car.setYear("1980");
        car.setStatus("");

        carList.add(car);               
    }




    public void onCellEdit(CellEditEvent event) {

        int rowIndex = event.getRowIndex();
        Cars car = null;
        LOGGER.info("Car Edited"+rowIndex);

        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();

        DataTable carTable = (DataTable)   event.getSource();
        String index = carTable.getClientId(FacesContext.getCurrentInstance());
        LOGGER.info(index);

        if(newValue != null && !newValue.equals(oldValue)) {
            LOGGER.info("Cell Changed Old: " + oldValue + ", New:" + newValue);
            car=carList.get(rowIndex);    
            carList.get(event.getRowIndex()).setStatus("Changed");      
            modifiedList.add(car);
        }
    }    
}

XHTML

<h:form id="cellEditForm">

    <p:dataTable id="cars" var="car" value="#{editView.carList}"
        editable="true" editMode="cell" widgetVar="cellCars">
        <f:facet name="header">Cell Editing</f:facet>

        <p:ajax event="cellEdit" listener="#{editView.onCellEdit}"
            update=":cellEditForm:cars" />

        <p:column headerText="Id">
            #{car.carId}
        </p:column>

        <p:column headerText="Model Name" style="background-color:yellow">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{car.modelNumber}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText id="modelInput" value="#{car.modelNumber}"
                        style="width:96%" />
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Year" style="background-color:yellow">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{car.year}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{car.year}" style="width:96%" label="Year" />
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Brand" style="background-color:yellow">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{car.brand}" />
                </f:facet>
                <f:facet name="input">
                    <h:selectOneMenu value="#{car.brand}" style="width:100%">
                        <f:selectItems value="#{editView.brands}" var="man"
                            itemLabel="#{man}" itemValue="#{man}" />
                    </h:selectOneMenu>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Self Driven" style="background-color:yellow">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{car.selfDriven}" />
                </f:facet>
                <f:facet name="input">
                    <p:inplace>
                        <p:inputText value="#{car.selfDriven}" />
                    </p:inplace>
                </f:facet>
            </p:cellEditor>
        </p:column>

        <p:column headerText="Color" style="background-color:yellow">
            <p:cellEditor>
                <f:facet name="output">
                    <h:outputText value="#{car.color}" />
                </f:facet>
                <f:facet name="input">
                    <p:inputText value="#{car.color}" style="width:96%" label="Color" />
                </f:facet>
            </p:cellEditor>
        </p:column>


        <p:column>
            <h:outputText value="#{car.status}" id="statusLabel"></h:outputText>

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

</h:form>

3 个答案:

答案 0 :(得分:0)

我最终使用了jquery。得到更新行的索引,并从我的bean中调用jquery函数。

RequestContext requestContext = RequestContext.getCurrentInstance();
String call = "updateCell(" + event.getRowIndex() + ")";
requestContext.execute(call);

Jquery代码

function updateCell(i) {
   var index =  "cellEditForm:cars:"+i+":statusLabel";  
   document.getElementById(index).innerHTML="Changed";
}

答案 1 :(得分:-1)

OmniFaces有一个很好的功能,称为'Ajax'

关于此的StackOverflow帖子显示了如何使用它:How to use OmniFaces Ajax.updateColumn() or Ajax.updateRow() via p:ajax

答案 2 :(得分:-2)

更新表格而非表格或将表格放入面板和更新面板。

安全

<h:form id="cellEditForm">
<p:panel id="something" styleclass="pero">
   <p:dataTable id="cars

update="@(.pero)"

确保将id放在面板上,因为类更新将搜索该ID并使用它。这个解决方案是因为我不知道其余的代码,它可以用于任何代码。