Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 不可切换操作重置a<;中的复选框;p:rowExpansion>;_Jsf_Primefaces - Fatal编程技术网

Jsf 不可切换操作重置a<;中的复选框;p:rowExpansion>;

Jsf 不可切换操作重置a<;中的复选框;p:rowExpansion>;,jsf,primefaces,Jsf,Primefaces,我在rowExpansion中有datatable,我可以通过复选框选择该表的行。我选择了其中一些。但当我点击行切换器图标以取消内部表的切换后,事件会重置“false”中的复选框。 我能避免这种行为吗 汽车品牌: import java.util.List; public class CarBrand { private final String brandName; private final List<CarModel> models; private

我在rowExpansion中有datatable,我可以通过复选框选择该表的行。我选择了其中一些。但当我点击行切换器图标以取消内部表的切换后,事件会重置“false”中的复选框。 我能避免这种行为吗

汽车品牌:

import java.util.List;

public class CarBrand {

    private final String brandName;
    private final List<CarModel> models;
    private boolean selected;

    public CarBrand(String brandName, List<CarModel> models) {
        this.brandName = brandName;
        this.models = models;
    }

    public String getBrandName() {
        return brandName;
    }

    public List<CarModel> getModels() {
        return models;
    }

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }
}
CDI托管Bean:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Named;
import org.primefaces.event.ToggleEvent;
import org.primefaces.model.Visibility;

@Named
@SessionScoped
public class Bean implements Serializable {

    List<CarBrand> brands;

    @PostConstruct
    private void init() {
        brands = new ArrayList<>();
        List<CarModel> carModels;

        carModels = new ArrayList<>();
        carModels.add(new CarModel("CL 63 AMG", 2011, 1));
        carModels.add(new CarModel("S-Class Coupe", 2014, 2));
        carModels.add(new CarModel("AMG GTS", 2015, 3));
        brands.add(new CarBrand("Mercedes", carModels));

        carModels = new ArrayList<>();
        carModels.add(new CarModel("M5 F10", 2012, 4));
        carModels.add(new CarModel("M6 F13", 2012, 5));
        carModels.add(new CarModel("X5 M", 2015, 6));
        brands.add(new CarBrand("BMW", carModels));

        carModels = new ArrayList<>();
        carModels.add(new CarModel("Polo", 2012, 7));
        carModels.add(new CarModel("Golf GTI", 2013, 8));
        carModels.add(new CarModel("Golf R", 2015, 9));
        brands.add(new CarBrand("Volkswagen", carModels));
    }

    public void onRowToggle(AjaxBehaviorEvent event) {
        ToggleEvent toggleEvent = (ToggleEvent) event;
        FacesMessage msg;
        if (toggleEvent.getVisibility() == Visibility.VISIBLE) {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Toggled", "Visibility:" + toggleEvent.getVisibility());
        } else {
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Untoggled", "Visibility:" + toggleEvent.getVisibility());
        }
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public List<CarBrand> getBrands() {
        return brands;
    }
}
import java.io.Serializable;
导入java.util.ArrayList;
导入java.util.List;
导入javax.annotation.PostConstruct;
导入javax.enterprise.context.SessionScoped;
导入javax.faces.application.FacesMessage;
导入javax.faces.context.FacesContext;
导入javax.faces.event.AjaxBehaviorEvent;
导入javax.inject.Named;
导入org.primefaces.event.ToggleEvent;
导入org.primefaces.model.Visibility;
@命名
@会议范围
公共类Bean实现了可序列化{
列出品牌;
@施工后
私有void init(){
brands=新的ArrayList();
列出carModels;
carModels=newarraylist();
CarModel.add(新CarModel(“CL 63 AMG”,2011,1));
CarModel.add(新CarModel(“S级轿跑车”,2014年,第2期));
CarModel.add(新CarModel(“AMG GTS”,2015年,第3期));
品牌。添加(新卡布兰德(“梅赛德斯”、“卡莫代尔”);
carModels=newarraylist();
CarModel.add(新CarModel(“M5 F10”,2012,4));
CarModel.add(新CarModel(“M6 F13”,2012,5));
CarModel.add(新CarModel(“X5 M”,2015,6));
品牌。添加(新卡布兰德(“宝马”,carModels));
carModels=newarraylist();
carModels.add(新CarModel(“Polo”,2012年第7期));
carModels.add(新CarModel(“高尔夫GTI”,2013年,第8期));
CarModel.add(新CarModel(“高尔夫R”,2015,9));
添加(新卡博兰(“大众”,carModels));
}
public void onRowToggle(AjaxBehaviorEvent事件){
ToggleEvent ToggleEvent=(ToggleEvent)事件;
面部信息味精;
if(toggleEvent.getVisibility()==可见性.VISIBLE){
msg=新的FacesMessage(FacesMessage.SEVERITY_信息,“切换”,“可见性:“+toggleEvent.getVisibility());
}否则{
msg=新的FacesMessage(FacesMessage.SEVERITY_信息,“未更改”,“可见性:”+toggleEvent.getVisibility());
}
FacesContext.getCurrentInstance().addMessage(null,msg);
}
公共品牌名单{
回归品牌;
}
}
和.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:f="http://xmlns.jcp.org/jsf/core"
  xmlns:p="http://primefaces.org/ui">
<f:view>
    <h:head>
        <title>TEST</title>
    </h:head>
    <h:body>
        <h:form id="testForm" prependId="true">
            <p:growl id="growl"/>
            <p:dataTable id="carsTable" value="#{bean.brands}" var="brand" style="width: 400px">
                <p:ajax event="rowToggle" listener="#{bean.onRowToggle}" update="testForm:growl"/>
                <p:column style="width: 20px">
                    <p:rowToggler/>
                </p:column>
                <p:column headerText="Brand">
                    <b><h:outputText value="#{brand.brandName}"/></b>
                </p:column>
                <p:rowExpansion>
                    <p:dataTable id="modelsTable" value="#{brand.models}" var="model">
                        <p:column headerText="Model">
                            <h:outputText value="#{model.modelName}"/>
                        </p:column>
                        <p:column headerText="Year">
                            <h:outputText value="#{model.year}"/>
                        </p:column>
                        <p:column style="width: 20px">
                            <f:facet name="header">
                                <p:selectBooleanCheckbox id="selectAll" value="#{brand.selected}" rendered="#{not empty brand.models}">
                                    <p:ajax/>
                                </p:selectBooleanCheckbox>
                            </f:facet>
                            <p:selectBooleanCheckbox id="modelSelect" value="#{model.selected}">
                                <p:ajax/>
                            </p:selectBooleanCheckbox>
                        </p:column>
                    </p:dataTable>
                </p:rowExpansion>
            </p:dataTable>
        </h:form>
    </h:body>
</f:view>

试验

这个问题比你提到的还要严重。这是由切换的实现引起的。如果您看到DOM中发生了什么,那么展开的项将被完全删除。向后切换时,对象将重新渲染

由于某些原因,文本值会被保留,但复选框会恢复为其原始值

不过,这种情况是值得的。如果不展开展开,则不会提交未渲染元素,这对于复选框意味着无论其原始值是什么,其值都将更改为“false”

您基本上有两种选择:

  • 将复选框移到扩展外
  • 在扩展区域外使用Javascript存储它们的值

  • 添加问题链接:谢谢,但我已经将它们的值保留在复选框所针对的对象中。我在Github问题中看到了一些与此行为相关的活动。我希望PM团队能正确地修复它。上面的建议是繁重而不舒服的解决方法。
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <f:view>
        <h:head>
            <title>TEST</title>
        </h:head>
        <h:body>
            <h:form id="testForm" prependId="true">
                <p:growl id="growl"/>
                <p:dataTable id="carsTable" value="#{bean.brands}" var="brand" style="width: 400px">
                    <p:ajax event="rowToggle" listener="#{bean.onRowToggle}" update="testForm:growl"/>
                    <p:column style="width: 20px">
                        <p:rowToggler/>
                    </p:column>
                    <p:column headerText="Brand">
                        <b><h:outputText value="#{brand.brandName}"/></b>
                    </p:column>
                    <p:rowExpansion>
                        <p:dataTable id="modelsTable" value="#{brand.models}" var="model">
                            <p:column headerText="Model">
                                <h:outputText value="#{model.modelName}"/>
                            </p:column>
                            <p:column headerText="Year">
                                <h:outputText value="#{model.year}"/>
                            </p:column>
                            <p:column style="width: 20px">
                                <f:facet name="header">
                                    <p:selectBooleanCheckbox id="selectAll" value="#{brand.selected}" rendered="#{not empty brand.models}">
                                        <p:ajax/>
                                    </p:selectBooleanCheckbox>
                                </f:facet>
                                <p:selectBooleanCheckbox id="modelSelect" value="#{model.selected}">
                                    <p:ajax/>
                                </p:selectBooleanCheckbox>
                            </p:column>
                        </p:dataTable>
                    </p:rowExpansion>
                </p:dataTable>
            </h:form>
        </h:body>
    </f:view>