Primefaces组件不刷新

时间:2013-01-11 21:05:15

标签: jsf-2 primefaces

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

添加工作正常;它每次都会增加一个新的车辆面板。问题是当我删除车辆时,面板被移除,但值仍然存在。例如,如果我有3辆车,其中年份为2008年,2010年,2012年,然后我删除了第一辆车,你会认为你会看到今年剩下的2个面板分别为2010年和2012年。相反,我看到2008年支持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看起来令人困惑,但这是以每个车辆面板显示在前一个面板旁边的方式编码的。在这种情况下,行可以被认为是一列。有人有什么想法吗?

0 个答案:

没有答案