对于我的XPage,我开发了一些Managed Beans来保存数据。页面本身包含一个Repeat控件,目前它是这样的:
<xp:panel styleClass="form">
<xp:this.dataContexts>
<xp:dataContext value="#{javascript:PageData.getForm(compositeData.formName, compositeData.dataSource);}"
var="myFormData">
</xp:dataContext>
<xp:dataContext var="myFields">
<xp:this.value><![CDATA[#{javascript:return myFormData.getFieldsAsJSON();}]]></xp:this.value>
</xp:dataContext>
</xp:this.dataContexts>
<xp:table style="width:100%" cellspacing="1" cellpadding="0">
<xp:repeat var="thisfield" rows="#{javascript:compositeData.rows}" disableTheme="true" repeatControls="true"
disableOutputTag="true" value="#{myFields}">
PageData对象是一个bean,它包含有关表单及其字段的信息。下拉字段包含选项,但可以动态创建它们。当发生这种情况时,作为部分刷新的结果,表单被重新显示但是......重复的值&#39;本身(myFields)没有重新加载到重复中,因此新的下拉选项不可用。
如何让XPage重新加载&#39;值&#39;属性?
UPDATE 更多信息,按要求......
从FormData bean:
public Object getFieldsAsJSON() {
ArrayObject list = null;
try {
System.err.print("FormData: getFieldsAsJSON");
list = new ArrayObject();
for (Entry<String, FieldData> e : fields.entrySet()) {
FieldData field = e.getValue();
list.addArrayValue(field.getJSON());
}
} catch (Exception e) {
}
return list;
}
并从FieldData bean:
public ObjectObject getJSON() throws InterpretException {
ObjectObject json = new ObjectObject();
json.put("name", FBSUtility.wrap(name));
json.put("label", FBSUtility.wrap(field.getLabel()));
json.put("options", FBSUtility.wrap(values));
return json;
}
恕我直言,问题不在于这些豆子。这更像是一个XPage问题,因为出于某种奇怪的原因,该结构只被提取一次,而且从未再次提取过。显然,XPages认为json是静态的,它不是。
在bean时代之前,我拥有SSJS中的所有内容,即时创建JavaScript对象,并且每次都重新加载。为什么不再,有什么区别?有没有什么可以告诉XPages重复值是“陈旧的”#39;应该重新阅读?
答案 0 :(得分:0)
使用当前代码,myFormData和myFields也将在每次部分刷新期间重新计算。这有必要吗?
我不确定,但是看看你看到了什么,我怀疑重复控制需要在XPages生命周期的特定阶段使用dataContexts的内容。但是在XPages生命周期的每个阶段都会重新计算dataContexts,这可能会导致它们在重复想要使用值时为空。
我最好的建议是调试部分刷新中哪些阶段发生的事情。您可能需要更改代码以解决何时计算的问题。
我不相信设置为动态计算的dataContexts是一种好方法,除非你将它们用于渲染属性或只读数据。如果您正在使用托管bean,那么延迟加载数据并直接从bean中检索它可能是一种更好的方法,并且可以更容易地识别它何时被调用。