1

我正在使用 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>();
4

1 回答 1

1

解决方案

我用解决方法解决了这个问题,会分享这个:

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>

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

于 2015-02-07T17:00:05.090 回答