Jsf 2 在模型中仅更新p:dataList的上次pe:fluidGrid迭代中的值

Jsf 2 在模型中仅更新p:dataList的上次pe:fluidGrid迭代中的值,jsf-2,primefaces,jsf-2.2,primefaces-extensions,Jsf 2,Primefaces,Jsf 2.2,Primefaces Extensions,在我的bean中,我有一个HashMap,我在中使用它来动态生成表单 首先,我生成FluidGridItems并将其放置在hashMap中: private HashMap<PDIDefinition, List<FluidGridItem>> formItems = new HashMap<>(); private void generateModel() { for (PDIDefinition pdid : pdiDefinitions) {

在我的bean中,我有一个
HashMap
,我在
中使用它来动态生成表单

首先,我生成FluidGridItems并将其放置在hashMap中:

private HashMap<PDIDefinition, List<FluidGridItem>> formItems = new HashMap<>();

private void generateModel() {

    for (PDIDefinition pdid : pdiDefinitions) {
        Fragment f = new Fragment();
        f.setDefinition(pdid.getFragmentDefinition());
        fragments.add(f);
        List<FluidGridItem> items = new ArrayList<>();
        formItems.put(pdid, items);

        //((DynamicField)((FluidGridItem)formItems.get(pdid).get(0)).getData()).label;

        for (FragmentValueDefinition fvd : f.getDefinition().getFragmentValues()) {
            FragmentValue fv = new FragmentValue();
            fv.setFragmentValueDefinition(fvd);
            fv.setFragmentId(f.getInner());
            if (f.getValues() == null) {
                f.setValues(new ArrayList<>());
            }
            f.getValues().add(fv);
            fragmentValues.add(fv); //not required?
            DynamicField df = new DynamicField((fv), items.size());
            fields.add(df);

            if ("String".equals(fvd.getType())) {
                items.add(new FluidGridItem(df, "stringValue"));
            }
            if ("Integer".equals(fvd.getType())) {
                items.add(new FluidGridItem(df, "integerValue"));
            }
            if ("Date".equals(fvd.getType())) {
                items.add(new FluidGridItem(df, "dateValue"));
            }
        }

    }

}
private HashMap formItems=new HashMap();
私有void generateModel(){
用于(PDIDefinition pdid:pdiDefinitions){
片段f=新片段();
f、 setDefinition(pdid.getFragmentDefinition());
加入(f);
列表项=新建ArrayList();
formItems.put(pdid、项目);
//((DynamicField)((FluidGridItem)formItems.get(pdid.get(0)).getData()).label;
对于(FragmentValueDefinition fvd:f.getDefinition().getFragmentValues()){
FragmentValue fv=新的FragmentValue();
fv.setFragmentValueDefinition(fvd);
setFragmentId(f.getInner());
如果(f.getValues()==null){
f、 setValues(新的ArrayList());
}
f、 getValues().add(fv);
fragmentValues.add(fv);//不是必需的吗?
DynamicField df=新的DynamicField((fv),items.size());
字段。添加(df);
if(“String”.equals(fvd.getType())){
添加(新的FluidGridItem(df,“stringValue”);
}
if(“Integer”.equals(fvd.getType())){
添加(新的FluidGridItem(df,“integerValue”);
}
如果(“Date”.equals(fvd.getType())){
添加(新的FluidGridItem(df,“dateValue”);
}
}
}
}
然后,我将其转换为:

public List getFormItemsForDisplay(){
Set s=formItems.entrySet();
返回新的ArrayList;
} 
最后,在我看来,我使用dataList和fluidGrid生成表单:

<p:dataList var="pdi" value="#{FormGenerator.formItemsForDisplay}" id="all" varStatus="loop" type="none">
        <p:panel id="panel" header="#{pdi.key.getFragmentDefinition().getFragmentName()}" style="margin-bottom:1em; width:100%;">

            <pe:fluidGrid  id="fluidGrid" value="#{pdi.value}" var="data"
                           hGutter="20" vGutter="10" widgetVar="fgwv_#{loop.index}">

                <pe:fluidGridItem type="stringValue"  id="txt_">
                    <div class="dynaFormLabel">
                        <p:outputLabel for="txt" value="#{data.label}"/>
                    </div>
                    <p:inputText id="txt" value="#{data.value}"/>
                </pe:fluidGridItem>
                <pe:fluidGridItem type="integerValue" id="int_">
                    <div class="dynaFormLabel">
                        <p:outputLabel for="int" value="#{data.label}"/>
                    </div>
                    <p:spinner id="int" value="#{data.value}" />
                </pe:fluidGridItem>
                <pe:fluidGridItem type="dateValue" id="cal_">
                    <div class="dynaFormLabel">
                        <p:outputLabel for="cal" value="#{data.label}"/>
                    </div>
                    <p:calendar id="cal" value="#{data.value}" showOn="button"/>
                </pe:fluidGridItem>

            </pe:fluidGrid>

        </p:panel>
    </p:dataList>

这就是我所希望的结果

我的问题是,服务器上只更新数据列表最后一次迭代的值(图像中的PDF)


谢谢你的帮助。

通过替换

<p:dataList var="pdi" value="#{FormGenerator.formItemsForDisplay}" 
    id="all" varStatus="loop" type="none">


我是从你那里得到这个主意的

<p:dataList var="pdi" value="#{FormGenerator.formItemsForDisplay}" 
    id="all" varStatus="loop" type="none">
<c:forEach var="pdi" items="#{FormGenerator.formItemsForDisplay}"
    id="all" varStatus="loop">