Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf Commandbutton仅在第二次单击时起作用,直到<;h:选择布尔复选框>;在HashMap上删除_Jsf_Jsf 2_Datatable_Hashmap_Selectbooleancheckbox - Fatal编程技术网

Jsf Commandbutton仅在第二次单击时起作用,直到<;h:选择布尔复选框>;在HashMap上删除

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

我正在使用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>

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