【问题标题】:XPages Managed Bean and Repeat Control issue: how to reload value?XPages Managed Bean 和重复控制问题:如何重新加载值?
【发布时间】:2015-02-14 21:05:56
【问题描述】:

对于我的 XPage,我开发了一些托管 Bean 来保存数据。页面本身包含一个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,它包含有关表单及其字段的信息。下拉字段包含选项,但它们可以动态创建。发生这种情况时,由于部分刷新,表单会重新显示,但是......重复“值”本身(myFields)不会重新加载到重复中,因此新的下拉选项不可用。

如何让 XPages 重新加载“值”属性?

更新 根据要求提供更多信息...

来自 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;
}

恕我直言,问题不在于这些 bean。这更像是一个 XPages 问题,因为出于某种奇怪的原因,该结构仅被获取一次,并且再也不会被获取。显然,XPages 认为 json 是静态的,但事实并非如此。

在 bean 时代之前,我在 SSJS 中拥有一切,动态创建 JavaScript 对象,并且每次都重新加载它。为什么不用了,有什么区别?有什么东西可以告诉 XPages 重复值是“陈旧的”并且应该重新读取吗?

【问题讨论】:

  • 我现在确实有一个工作区:对象没有被重新评估,上例中的这个字段也没有改变,但是...... myFields[indexVar].options 是!

标签: xpages repeater managed-bean


【解决方案1】:

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

我不确定,但看看您所看到的,我怀疑重复控件在 XPage 生命周期的特定阶段需要 dataContexts 的内容。但是 dataContexts 将在 XPages 生命周期的每个阶段重新计算,这可能导致当重复想要使用这些值时它们为 null。

我最好的建议是调试在部分刷新的哪个阶段发生了什么。您可能需要更改代码以解决计算时间的问题。

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

【讨论】:

  • 那些 DataContexts 是使其工作的最新尝试。我完全没有它们,直接从 bean 获取数据,结果相同。我确实需要重新执行代码,并且在对 bean 的调用中进行了一些调试,告诉我上下文确实已更新。与重复控制值不同...
  • 如何将repeat 的value 属性更改为SSJS,包括日志语句。使用 XPages OpenLog Logger,您将能够从堆栈跟踪中看到它被触发的最早阶段(如果在多个阶段为同一组件捕获相同的消息,它只会记录一次;但包括 @Unique() 你可以得到每个阶段)。
  • 现在是EL,但以前是SSJS,根本没有DataContexts。我也有日志,在那里使用我自己的日志记录,但它甚至没有在部分刷新时调用。
  • 建议您从 Bean 本身添加相关代码。这可能值得一看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多