0

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

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

}

4

2 回答 2

1

之所以会这样,是因为:

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

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

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

于 2013-08-29T07:08:09.013 回答
0

这可能是 bean 范围的问题。如果场景是这样的: 前提条件: - 表刚刚显示。场景: - 选择一些复选框。- 删除行当前结果 - 选中复选框未选中。

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

于 2013-08-29T07:06:35.603 回答