命令按钮仅在第二次单击时起作用,直到删除 HashMap 上的 <h:selectBooleanCheckbox>
Commandbutton works only on second click until a <h:selectBooleanCheckbox> on a HashMap is removed
我正在使用 JSF 2.2.9,我有以下数据表和按钮:
<h:commandButton id="commandButtonRemoverSelected"
actionListener="#{managedBeanName.removeSelected()}"
class="btn btn-primary" value="Sim">
</h:commandButton>
<h:dataTable var="bean" value="#{managedBeanName.beans}" styleClass="table table-hover"
binding="#{managedBeanName.dataTable}">
<h:column headerClass="smallColumn">
<f:facet name="header">
<h:selectBooleanCheckbox valueChangeListener="#{managedBeanName.selectAll}">
<f:ajax execute="@form" render="@all" />
</h:selectBooleanCheckbox>
</f:facet>
<h:selectBooleanCheckbox value="#{managedBeanName.registrosSelecionados[bean]}" />
</h:column>
</h:dataTable>
按钮 "commandButtonRemoverSelected" 仅在第二次单击时调用 actionListener。当我从数据表中删除以下行时,一切正常(第一次单击时调用 commandButton):
<h:selectBooleanCheckbox value="#{managedBeanName.registrosSelecionados[bean]}" />
因此,我的 managedBean 有一个名为 'registrosSelecionados' 的 MAP,它应该存储一对 "Bean,Boolean"。参见:
private Map<Bean, Boolean> registrosSelecionados = new HashMap<Bean, Boolean>();
解决方案
我用 解决方法 解决了这个问题,我会分享这个:
1 - 我注意到每个第一次单击 'getRegistrosSelecionados()' 的 commandButton 都会被调用,而 actionListener 不会。所以我想 JSF 正在处理 getRegistrosSelecionados() 而没有处理 actionListener,我不知道为什么,这才是真正的问题。在第二次点击中,actionListener 被处理,因为在第一次点击中所有复选框都已发送到 ManagedBean。
2 - 因此,我的解决方法是强制复选框中的每次单击都调用 JSF 请求,而不是等待 commandButton 提交。这样,当单击 commandButton 时,将处理所有复选框。
<h:selectBooleanCheckbox value="#{cc.attrs.managedBeanName.registrosSelecionados[bean]}">
<f:ajax execute="@this" render="@this" />
</h:selectBooleanCheckbox>
我的复选框收到 ajax 仅执行自身并呈现自身,当我单击 commandButton 时,我只需要执行 commandButton 并再次呈现表单:
<h:commandButton id="commandButtonRemoverSelected"
actionListener="#{cc.attrs.managedBeanName.removeSelected()}"
class="btn btn-primary" value="Sim">
<f:ajax execute="@this" render="@form" />
</h:commandButton>
这个变通方法对我有用,因为我没有找到解决这个问题的更好方法。
我正在使用 JSF 2.2.9,我有以下数据表和按钮:
<h:commandButton id="commandButtonRemoverSelected"
actionListener="#{managedBeanName.removeSelected()}"
class="btn btn-primary" value="Sim">
</h:commandButton>
<h:dataTable var="bean" value="#{managedBeanName.beans}" styleClass="table table-hover"
binding="#{managedBeanName.dataTable}">
<h:column headerClass="smallColumn">
<f:facet name="header">
<h:selectBooleanCheckbox valueChangeListener="#{managedBeanName.selectAll}">
<f:ajax execute="@form" render="@all" />
</h:selectBooleanCheckbox>
</f:facet>
<h:selectBooleanCheckbox value="#{managedBeanName.registrosSelecionados[bean]}" />
</h:column>
</h:dataTable>
按钮 "commandButtonRemoverSelected" 仅在第二次单击时调用 actionListener。当我从数据表中删除以下行时,一切正常(第一次单击时调用 commandButton):
<h:selectBooleanCheckbox value="#{managedBeanName.registrosSelecionados[bean]}" />
因此,我的 managedBean 有一个名为 'registrosSelecionados' 的 MAP,它应该存储一对 "Bean,Boolean"。参见:
private Map<Bean, Boolean> registrosSelecionados = new HashMap<Bean, Boolean>();
解决方案
我用 解决方法 解决了这个问题,我会分享这个:
1 - 我注意到每个第一次单击 'getRegistrosSelecionados()' 的 commandButton 都会被调用,而 actionListener 不会。所以我想 JSF 正在处理 getRegistrosSelecionados() 而没有处理 actionListener,我不知道为什么,这才是真正的问题。在第二次点击中,actionListener 被处理,因为在第一次点击中所有复选框都已发送到 ManagedBean。
2 - 因此,我的解决方法是强制复选框中的每次单击都调用 JSF 请求,而不是等待 commandButton 提交。这样,当单击 commandButton 时,将处理所有复选框。
<h:selectBooleanCheckbox value="#{cc.attrs.managedBeanName.registrosSelecionados[bean]}">
<f:ajax execute="@this" render="@this" />
</h:selectBooleanCheckbox>
我的复选框收到 ajax 仅执行自身并呈现自身,当我单击 commandButton 时,我只需要执行 commandButton 并再次呈现表单:
<h:commandButton id="commandButtonRemoverSelected"
actionListener="#{cc.attrs.managedBeanName.removeSelected()}"
class="btn btn-primary" value="Sim">
<f:ajax execute="@this" render="@form" />
</h:commandButton>
这个变通方法对我有用,因为我没有找到解决这个问题的更好方法。