从数据表删除而不影响复选框事件

时间:2013-08-29 06:28:50

标签: jsf

我有一个数据表,其中第一个组件是删除按钮,最后一个是复选框。 现在的问题是,当我删除一行时,它会重置在其他行中选中的复选框 我不想取消选中其他行中的选中复选框。

<h:dataTable id="languageTableBody" value="#{countryBean.countryLanguageList}" var="countryLangObj" >
        <h:column>
            <f:facet name="header">#{msg['country.language.label.delete']}</f:facet>
             <p:commandLink action="#{countryBean.deleteRow}" immediate="true" update="@form" process="@this">
                <h:graphicImage value="../images/delete.png"  />
                <f:setPropertyActionListener target="#{countryBean.langId}" value="#{countryLangObj.language.languageCode}" />
             </p:commandLink>
        </h:column>
        <h:column>
            <f:facet name="header">#{msg['country.language.label.assignlanguage']}</f:facet>
            <h:inputText readonly="true" value="#{countryLangObj.language.languageName}" id="languageName" />
        </h:column>

        <h:column>
            <f:facet name="header">#{msg['country.language.label.languagecode']}</f:facet>
            <h:inputText readonly="true" value="#{countryLangObj.language.languageCode}" />
        </h:column>
        <h:column>
            <f:facet name="header">#{msg['country.language.label.defaultlanguage']}</f:facet>
            <h:selectBooleanCheckbox id="checkBox" value="#{countryLangObj.isDefaultLanguage}" onclick="dataTableSelectOneRadio(this)" />

        </h:column>
    </h:dataTable>

countryBean.java

public String deleteRow(){
    System.out.println("deleteRow()::Enter");
    String delLangId = getLangId();
    System.out.println("getLangId(): "+getLangId());
    if(null != delLangId && delLangId.trim().length() > 0){
        System.out.println("Delete Language Code: "+delLangId);
        List<CountryLanguageDTO> countryLangList = getCountryLanguageList();
        System.out.println("countryLangList: "+ (null == countryLangList));
        List<CountryLanguageDTO> tempCountryLangList = new ArrayList<CountryLanguageDTO>();
        for (CountryLanguageDTO countryLanguage : countryLangList) {
            System.out.println("wewewewew: "+delLangId.equalsIgnoreCase(countryLanguage.getLanguage().getLanguageCode()));
            if(!delLangId.equalsIgnoreCase(countryLanguage.getLanguage().getLanguageCode())){
                tempCountryLangList.add(countryLanguage);
            }
        }
        setCountryLanguageList(tempCountryLangList);
    }
    return SUCCESS;
}

addCountry.js

function dataTableSelectOneRadio(radio) {
var id = radio.name.substring(radio.name.lastIndexOf(':'));
var el = radio.form.elements;
for (var i = 0; i < el.length; i++) {
    if (el[i].name.substring(el[i].name.lastIndexOf(':')) == id) {
        el[i].checked = false;
    }
}
radio.checked = true;

}

2 个答案:

答案 0 :(得分:1)

这是因为:

<p:commandLink action="#{countryBean.deleteRow}" immediate="true" update="@form" process="@this">

单击按钮时,您将使用复选框发送表单。但由于process="@this",您不会转换/验证/存储任何输入。唯一需要处理的是按钮本身。之后,由于update="@form",将重新呈现整个表单(包括带有复选框的表)。但是使用旧的值。

因此,解决方案是将process="@this"更改为@form或添加Ajax功能,以便在每次值更改时存储每个复选框的新值。

答案 1 :(得分:0)

这可能是bean范围的问题。如果场景如下: 前提: -Table刚刚展示。 场景: - 选择一些复选框。 - 删除行 目前的结果 - 未选中复选框。

因此,在删除行之后,您可以重新启动视图,以便所有数据都获得默认状态。 尝试将范围更改为View(CDI)或Session。