我有一个数据表,其中第一个组件是删除按钮,最后一个是复选框。 现在的问题是,当我删除一行时,它会重置在其他行中选中的复选框 我不想取消选中其他行中的选中复选框。
<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;
}
答案 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。