0

我一直在看 Primefaces 3.4.2,因为 IceFaces 3.2.0 有太多问题。我有一个包含在面板中的车辆数据网格。我有一个添加按钮,每个车辆面板都包含一个删除按钮。

添加工作正常;它每次都会添加一个新的车辆面板。问题是当我删除车辆时,面板被删除,但值仍然存在。例如,如果我有 3 辆车,年份分别为 2008、2010、2012,然后我删除了第一辆车,你会认为你会看到剩下的 2 个面板,年份分别是 2010 和 2012。相反,我看到的是 2008和 2012 年。支持 bean 做得正确,如果我手动刷新屏幕,我确实看到了正确的值。现在我已经介绍了我的案例,下面是代码:

<p:dataGrid id="vehicleGrid" var="currentVehicle" value="#{vehicleInfoBean.getVehicleList()}" columns="#{vehicleInfoBean.getVehicleList().size()}" styleClass="vehicleInfoPanel" rowIndexVar="rowIdx">
    <p:panel header="VEHICLE ##{rowIdx+1}:" style="width:100%" styleClass="textEntryInputTable">
        <h:panelGrid columns="1" style="width:100%" styleClass="vehicleInfoPanel">
                <ui:include src="../components/vehicleinfo/vehiclecomponents.xhtml">
                    <ui:param name="currentVehicle" value="#{currentVehicle}" />
                    <ui:param name="labelOnly" value="false" />
                </ui:include>
            <div class="deleteButton">
                <p:commandButton value="Remove" label="Delete Vehicle" action="#{vehicleInfoBean.deleteVehicle}" update=":vehicleInfoForm:vehicleGrid" process="@this">
                    <f:setPropertyActionListener value="#{currentVehicle}" target="#{vehicleInfoBean.currentVehicle}" />
                </p:commandButton>
            </div>
        </h:panelGrid>
    </p:panel>
 </p:dataGrid>

有任何想法吗?我尝试了各种更新值,包括@form,但都是一样的。我以前没有使用过 dataGrid,但我需要 ice:panelSeries 具有的迭代功能。

更新:这是包含中的代码:

<h:panelGrid columns="2">
    <p:inputText id="vinInput" styleClass="stdFieldControl" value="#{currentVehicle.vin}" label=""
                 required="true" requiredMessage="VIN is required" >
        <p:ajax update="@this vinMsg"/>
    </p:inputText>
    <p:message id="vinMsg" for="vinInput" errorClass="ui-state-error-text"/>
    <p:outputLabel value="-----OR-----"/>
</h:panelGrid>

2013 年 1 月 14 日 - 更新代码

<p:dataGrid id="vehicleGrid" var="currentVehicle" value="#{vehicleInfoBean.getVehicleList()}" columns="#{vehicleInfoBean.getVehicleList().size()}" styleClass="vehicleInfoPanel" rowIndexVar="rowIdx">
    <p:panel header="VEHICLE ##{rowIdx+1}:" style="width:100%" styleClass="textEntryInputTable">
        <h:panelGrid columns="1" style="width:100%" styleClass="vehicleInfoPanel">
            <p:inputText id="vinInput" styleClass="stdFieldControl" value="#{currentVehicle.vin}" label="" required="#{empty param['vehicleGrid:0:btnDelete'] and empty param['btnAdd']}" requiredMessage="VIN is required" >
            </p:inputText>
            <p:message id="vinMsg" for="vinInput" errorClass="ui-state-error-text"/>
            <p:outputLabel value="-----OR-----"/>
            <h:inputText id="yearInput" styleClass="stdFieldControl" value="#{currentVehicle.year}" label=""
                                             required="#{empty param['vehicleGrid:0:btnDelete']}" requiredMessage="Year is required">
            </h:inputText>
            <p:message id="yearMsg" for="yearInput"
                                           errorClass="ui-state-error-text"/>
            <div class="deleteButton">
                <p:commandButton id="btnDelete" value="Remove" label="Delete Vehicle" action="#{vehicleInfoBean.deleteVehicle}" update="@form">
                    <f:setPropertyActionListener value="#{currentVehicle}" target="#{vehicleInfoBean.currentVehicle}" />
                </p:commandButton>
            </div>
        </h:panelGrid>
    </p:panel>
</p:dataGrid>

添加代码如下所示:

<div class="addButton" style="padding-left: 2.17%; float: left; clear: both">
    <p:commandButton id="btnAdd" value="AddVehicle" label="Add Vehicle" actionListener="#{vehicleInfoBean.addVehicle}" update="vehicleGrid"/>
</div>

我决定设置引用按钮的组件的必需属性,而不是检查按钮。如果我对迭代器索引进行硬编码,则此代码有效。例如,required="#{empty param['vehicleGrid:0:btnDelete']}"。此代码指向 panelGrid 中的第一个删除按钮。我需要动态地导出索引 - required="#{empty param['vehicleGrid: #{rowIdx} :btnDelete']}"。添加按钮很简单,因为它不驻留在迭代器中。如何以可以动态引用 panelGrid 的 rowId 的方式对参数进行编码?RowId 看起来令人困惑,但它的编码方式是每个车辆面板都显示在前一个面板旁边。在这种情况下,行可以被认为是一列。有人有想法么?

4

0 回答 0