Jsf Commandbutton仅在第二次单击时起作用,直到<;h:选择布尔复选框>;在HashMap上删除
我正在使用JSF 2.2.9,我有以下dataTable和按钮:Jsf Commandbutton仅在第二次单击时起作用,直到<;h:选择布尔复选框>;在HashMap上删除,jsf,jsf-2,datatable,hashmap,selectbooleancheckbox,Jsf,Jsf 2,Datatable,Hashmap,Selectbooleancheckbox,我正在使用JSF 2.2.9,我有以下dataTable和按钮: <h:commandButton id="commandButtonRemoverSelected" actionListener="#{managedBeanName.removeSelected()}" class="btn btn-primary" value="Sim"> &l
<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。从datatabe中删除以下行时,一切正常(第一次单击时调用commandButton):
因此,我的managedBean有一个名为“registrosSelecionados”的映射,它应该存储一对“Bean,Boolean”。见:
private-Map registrosSelecionados=new-HashMap();
解决方案
我通过一个变通办法解决了这个问题,我想与大家分享一下:
1-我注意到,每个第一个命令按钮单击“getRegistrosSelecionados()”都会被调用,而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>
这个变通方法对我很有效,因为我没有找到更好的解决方案。可能是viewstate的一个bug。您当前的viewstate设置是什么(请尝试
服务器)?另外,您在getter中没有为registrosSelecionados
执行任何业务逻辑,是吗?至少,binding=“#{someTooBroadScopedBean.component}
和render=“@all“
这些都很可怕。清除它们,然后重试。@BlausC,我需要使用“绑定”来获取ManagedBean中选定的行,如果需要,如何清除它们?PS:我已经尝试删除绑定,但问题仍然存在。@kolossus,我的视图状态是“服务器”。我在getter没有做任何商业逻辑。谢谢。浪费了一天去了解发生了什么。最简单的方法是使用素数面。但在这种情况下,我也希望使用我的样式,而不是
<h:selectBooleanCheckbox value="#{cc.attrs.managedBeanName.registrosSelecionados[bean]}">
<f:ajax execute="@this" render="@this" />
</h:selectBooleanCheckbox>
<h:commandButton id="commandButtonRemoverSelected"
actionListener="#{cc.attrs.managedBeanName.removeSelected()}"
class="btn btn-primary" value="Sim">
<f:ajax execute="@this" render="@form" />
</h:commandButton>