脏检查:JSF + Primefaces应用程序?

时间:2012-06-04 14:31:34

标签: java jsf java-ee jsf-2 primefaces

我有web应用程序,我在其中使用JSF + Primefaces进行UI。我在网页上应用脏检查时遇到困难,特别是在使用AJAX调用时,例如在数据表的rowSelect事件上调用AJAX。

以下是我想用AJAX调用应用脏检查的确切场景。以下是我在网页中使用的组件。

1)我有一个由名为'companyBean'的bean填充的dataTable(具有公司属性)

<p:dataTable id="basic" var="company" value="#{companyInfoBean.companyList}" 
    rowKey="#{company.id}"
    selection="#{companyInfoBean.selectedCompany}" selectionMode="single">

    <p:ajax event="rowSelect" update=":customerDataForm:customerDataFields" />

    <p:column id="modelHeader">
        <f:facet name="header">
            <h:outputText value="Company Name" />
        </f:facet>
        <h:outputText value="#{company.companyName}" />
    </p:column>
      more columns....
</p:dataTable>

如上所述选择行(AJAX调用),我更新页面底部表格中的值

<h:form id="customerDataForm">
<p:panel id="customerDataFields">
<p:panelGrid >
<p:row>
    <p:column>
        <h:outputLabel for="companyname" value="Company Name " />
    </p:column>
    <p:column>
        <p:inputText id="companyname" value="#{companyInfoBean.selectedCompany.companyName}" label="Company Name" />
    </p:column>
         more columns...
  <p:row>
    <p:column colspan="2" style="text-align:right">
        <p:commandButton value="Save" actionListener="#{companyInfoBean.updateCompany}" 
        update=":customerDataForm:customerDataTable"/>
    </p:column>
    <p:column colspan="2" style="text-align:left">
        <p:commandButton value="Undo" />
    </p:column>
</p:row>

在上面的表单中,用户可以编辑在数据表上的rowSelect上更新的值。

现在我想对数据表上的rowSelection上的表单进行脏检查,即如果在表单上有一些未保存的更改,即使执行了对rowSelect的AJAX调用,也会提示用户使用该更改。

基本上我可以从这个场景中理解...我需要一些基于条件的AJAX调用,而不是直截了当。或者我必须使用一些jQuery的东西来实现脏检查。

1 个答案:

答案 0 :(得分:1)

您可以通过不同的方式实现此目的。这里有几个(我更喜欢方法3,如果弹出窗口没问题):

方法1:

a)使用selectedCompany的副本,例如editCompanyBean作为支持     customerDataFields的bean  b)为ajax事件添加“监听器”     这可以在设置之前检查editCompanyBean的空值     这与selectedCompany的值有关。如果失败了你可以咆哮     消息并阻止复制。     注意:您可以使用覆盖开关覆盖(b)
 c)保存editCompanyBean时将其初始化为null     字段的值。

方法2:

a)在selectedCompany的set语句中检查bean是否已填充值。如果已填充并跳过编辑,则会发出警告消息  b)让用户在继续操作之前单击customerDataFields上的save或reset     注意:每次保存或重置customerDataFields后清除selectedCompany

方法3:

a)将customerDataField放在模态弹出对话框中。进行设置,以便用户在继续操作之前必须保存或重置 b)ajax事件将弹出上面的模态对话框。您也可以使用按钮弹出。