Commandbutton仅在第二次单击时起作用,直到删除HashMap上的<h:selectbooleancheckbox> </h:selectbooleancheckbox>

时间:2015-02-05 01:53:51

标签: jsf jsf-2 datatable hashmap selectbooleancheckbox

我正在使用JSF 2.2.9,我有以下dataTable和按钮:

<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>

按钮&#34; commandButtonRemoverSelected&#34;只需在第二次单击时调用actionListener。当我从datatabe中删除以下行时,一切正常(首次单击时调用commandButton):

<h:selectBooleanCheckbox value="#{managedBeanName.registrosSelecionados[bean]}" />

因此,我的managedBean有一个名为&#39; registrosSelecionados&#39;应该存储一对&#34; Bean,Boolean&#34;。参见:

private Map<Bean, Boolean> registrosSelecionados = new HashMap<Bean, Boolean>();

1 个答案:

答案 0 :(得分:1)

<强>解

我用解决方法解决了这个问题,我想分享一下:

1 - 我注意到每个第一个commandButton单击'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>

这个解决方法对我有用,因为我找不到更好的解决方案来解决这个问题。