XPages Managed Bean和Repeat Control问题:如何重新加载值?

时间:2014-12-16 14:10:17

标签: xpages repeater managed-bean

对于我的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;应该重新阅读?

1 个答案:

答案 0 :(得分:0)

使用当前代码,myFormData和myFields也将在每次部分刷新期间重新计算。这有必要吗?

我不确定,但是看看你看到了什么,我怀疑重复控制需要在XPages生命周期的特定阶段使用dataContexts的内容。但是在XPages生命周期的每个阶段都会重新计算dataContexts,这可能会导致它们在重复想要使用值时为空。

我最好的建议是调试部分刷新中哪些阶段发生的事情。您可能需要更改代码以解决何时计算的问题。

我不相信设置为动态计算的dataContexts是一种好方法,除非你将它们用于渲染属性或只读数据。如果您正在使用托管bean,那么延迟加载数据并直接从bean中检索它可能是一种更好的方法,并且可以更容易地识别它何时被调用。