模型中仅更新 p:dataList 的最后 pe:fluidGrid 次迭代的值
Only values from last pe:fluidGrid iteration of p:dataList are updated in model
在我的 bean 中,我有一个 HashMap<PDIDefinition, List<FluidGridItem>>
,我在 <p:dataList>
中使用它来动态生成一个表单。
首先我生成 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"));
}
}
}
}
然后我按照 Displaying Hashmap keys and values in a primefaces DataTable:
中的说明转换它们
public List<Map.Entry<PDIDefinition,List<FluidGridItem>>> getFormItemsForDisplay(){
Set <Map.Entry<PDIDefinition,List<FluidGridItem>>> s = formItems.entrySet();
return new ArrayList<>(s);
}
最后,在我看来,我使用 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>
结果就是我想要的形式。
我的问题是,只有 dataList 最后一次迭代的值在服务器上更新(图像中的 PDF)。
感谢您的帮助。
通过替换
解决了它
<p:dataList var="pdi" value="#{FormGenerator.formItemsForDisplay}"
id="all" varStatus="loop" type="none">
来自
<c:forEach var="pdi" items="#{FormGenerator.formItemsForDisplay}"
id="all" varStatus="loop">
灵感来自 https://zenidas.wordpress.com/recipes/jsf-update-single-entry-in-a-datalist-like-component/
在我的 bean 中,我有一个 HashMap<PDIDefinition, List<FluidGridItem>>
,我在 <p:dataList>
中使用它来动态生成一个表单。
首先我生成 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"));
}
}
}
}
然后我按照 Displaying Hashmap keys and values in a primefaces DataTable:
中的说明转换它们public List<Map.Entry<PDIDefinition,List<FluidGridItem>>> getFormItemsForDisplay(){
Set <Map.Entry<PDIDefinition,List<FluidGridItem>>> s = formItems.entrySet();
return new ArrayList<>(s);
}
最后,在我看来,我使用 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>
结果就是我想要的形式。
我的问题是,只有 dataList 最后一次迭代的值在服务器上更新(图像中的 PDF)。
感谢您的帮助。
通过替换
解决了它<p:dataList var="pdi" value="#{FormGenerator.formItemsForDisplay}"
id="all" varStatus="loop" type="none">
来自
<c:forEach var="pdi" items="#{FormGenerator.formItemsForDisplay}"
id="all" varStatus="loop">
灵感来自 https://zenidas.wordpress.com/recipes/jsf-update-single-entry-in-a-datalist-like-component/