单击 h:commandLink 后单击 a4j:commandLink 时页面冻结
Page Freezes When a4j:commandLink is Clicked After Clicking on h:commandLink
我有一个带有支持 bean 的 jsf 页面。该页面包含 h:form
多个输入字段和按钮。整个页面使用 h:commandLink
提交,同时还有几个 a4j:commandLink
按钮。 h:commandLink
提交页面后单击 a4j:commandLink
按钮,页面将无限期地进入 "Loading, please wait" 状态。
页面看起来像:
<a4j:region>
<rich:dataTable id="itemsTable" ...>
<!-- richColumns-->
<rich:column>
<a4j:commandLink id="calculate_item" action="#{BackingBean.calculateItem}" value="Calculate" reRender="itemsTable">
<f:param name="itemIndex" value="#{rowIndex}" />
</a4j:commandLink>
<a4j:commandLink id="delete_item" immediate="true" action="#{BackingBean.cleanItem}" value="Delete" reRender="itemsTable">
<f:param name="itemIndex" value="#{rowIndex}" />
</a4j:commandLink>
</rich:column>
<f:facet name="footer">
<!-- richColumns-->
<rich:column>
<a4j:commandLink id="sum_all" styleClass="submit input-submit" action="#{BackingBean.calculateTotalSum}" value="Calculate Total" reRender="itemsTable" />
</rich:column>
</f:facet>
</rich:dataTable>
</a4j:region>
<h:commandLink id="save" styleClass="submit" value="Save" action="#{BackingBean.save}" />
我的 BackingBean 如下所示:
public class BackingBean {
// Fields and methods
public void calculateItem() {
// calculates
}
public void calculateTotalSum() {
// calculates total
}
public String save() {
boolean formIsValid = true;
// do validations
// save if the form is valid
return formIsValid ? "success" : null;
}
}
- 当我按下 "Calculate" 按钮或 "Calculate Total" 按钮时,一切正常。
- 当我按下 "Save" 按钮时,一切正常(如果表单包含无效字段(如必填字段为空),则会显示验证消息)。
- 当有一些无效字段时,我按下 "Save" 按钮,然后 "Calculate" 一切正常。
- 当有一些无效字段时,我按下 "Save" 按钮,然后 "Calculate Total" 页面无限期进入 "Loading, please wait" 状态。
问题是: 为什么 a4j:commandLink
"Calculate" 和 "Calculate Total" 的行为不同以及如何解决 a4j:commandLink
的问题"Calculate Total"(有什么问题)?
P.S. 忘了说一件事:如果我用
<a4j:commandLink id="sum_all" action="#{BackingBean.calculateTotalSum}" value="Calculate Total" reRender="itemsTable" />
和
<h:commandLink id="sum_all" action="#{BackingBean.calculateTotalSum}" value="Calculate Total">
<a4j:support reRender="itemsTable" event="" />
</h:commandLink>
一切正常,但有一个限制:单击按钮后所有验证消息都将被删除。
我终于解决了这个问题。
原因是 css "submit" class 用于带有 "input-submit" class 的 "Calculate Total" 按钮。我试图找到导致问题的确切属性,但找不到。所以一个变通的解决方案是:添加一个新的 css class: "audit-input-submit" 这是 "submit" 和 "input-submit" [=21= 的属性的组合]es(不包括重复项)。之后问题解决了。当然,如果我能找到导致问题的确切 css 属性值会更好。
我有一个带有支持 bean 的 jsf 页面。该页面包含 h:form
多个输入字段和按钮。整个页面使用 h:commandLink
提交,同时还有几个 a4j:commandLink
按钮。 h:commandLink
提交页面后单击 a4j:commandLink
按钮,页面将无限期地进入 "Loading, please wait" 状态。
页面看起来像:
<a4j:region>
<rich:dataTable id="itemsTable" ...>
<!-- richColumns-->
<rich:column>
<a4j:commandLink id="calculate_item" action="#{BackingBean.calculateItem}" value="Calculate" reRender="itemsTable">
<f:param name="itemIndex" value="#{rowIndex}" />
</a4j:commandLink>
<a4j:commandLink id="delete_item" immediate="true" action="#{BackingBean.cleanItem}" value="Delete" reRender="itemsTable">
<f:param name="itemIndex" value="#{rowIndex}" />
</a4j:commandLink>
</rich:column>
<f:facet name="footer">
<!-- richColumns-->
<rich:column>
<a4j:commandLink id="sum_all" styleClass="submit input-submit" action="#{BackingBean.calculateTotalSum}" value="Calculate Total" reRender="itemsTable" />
</rich:column>
</f:facet>
</rich:dataTable>
</a4j:region>
<h:commandLink id="save" styleClass="submit" value="Save" action="#{BackingBean.save}" />
我的 BackingBean 如下所示:
public class BackingBean {
// Fields and methods
public void calculateItem() {
// calculates
}
public void calculateTotalSum() {
// calculates total
}
public String save() {
boolean formIsValid = true;
// do validations
// save if the form is valid
return formIsValid ? "success" : null;
}
}
- 当我按下 "Calculate" 按钮或 "Calculate Total" 按钮时,一切正常。
- 当我按下 "Save" 按钮时,一切正常(如果表单包含无效字段(如必填字段为空),则会显示验证消息)。
- 当有一些无效字段时,我按下 "Save" 按钮,然后 "Calculate" 一切正常。
- 当有一些无效字段时,我按下 "Save" 按钮,然后 "Calculate Total" 页面无限期进入 "Loading, please wait" 状态。
问题是: 为什么 a4j:commandLink
"Calculate" 和 "Calculate Total" 的行为不同以及如何解决 a4j:commandLink
的问题"Calculate Total"(有什么问题)?
P.S. 忘了说一件事:如果我用
<a4j:commandLink id="sum_all" action="#{BackingBean.calculateTotalSum}" value="Calculate Total" reRender="itemsTable" />
和
<h:commandLink id="sum_all" action="#{BackingBean.calculateTotalSum}" value="Calculate Total">
<a4j:support reRender="itemsTable" event="" />
</h:commandLink>
一切正常,但有一个限制:单击按钮后所有验证消息都将被删除。
我终于解决了这个问题。 原因是 css "submit" class 用于带有 "input-submit" class 的 "Calculate Total" 按钮。我试图找到导致问题的确切属性,但找不到。所以一个变通的解决方案是:添加一个新的 css class: "audit-input-submit" 这是 "submit" 和 "input-submit" [=21= 的属性的组合]es(不包括重复项)。之后问题解决了。当然,如果我能找到导致问题的确切 css 属性值会更好。