我一直在看 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 看起来令人困惑,但它的编码方式是每个车辆面板都显示在前一个面板旁边。在这种情况下,行可以被认为是一列。有人有想法么?