Refresh 刷新新文档以使默认值显示在计算控件中

Refresh 刷新新文档以使默认值显示在计算控件中,refresh,xpages,default,Refresh,Xpages,Default,这个问题困扰了我一段时间,我似乎无法回避。所以我把它剥离到最基本的层次。 1.创建新的XPage并将其绑定到现有表单 2.创建了一个名为“displayPanel”的面板 3.在面板内部创建一个组合框,并给它一些值和任何有效值的默认值。 4.设置对displayPanel进行部分刷新的onChange事件 5.添加一个仅显示组合框值的计算字段。 6添加了一个按钮,可对displayPanel onClick进行部分刷新 打开XPage,计算字段为空,进行更改,计算字段显示 再次打开XPage并单

这个问题困扰了我一段时间,我似乎无法回避。所以我把它剥离到最基本的层次。 1.创建新的XPage并将其绑定到现有表单 2.创建了一个名为“displayPanel”的面板 3.在面板内部创建一个组合框,并给它一些值和任何有效值的默认值。 4.设置对displayPanel进行部分刷新的onChange事件 5.添加一个仅显示组合框值的计算字段。 6添加了一个按钮,可对displayPanel onClick进行部分刷新

打开XPage,计算字段为空,进行更改,计算字段显示

再次打开XPage并单击刷新按钮,此时将显示计算字段

现在这是一个非常简单的例子,但我需要做的实际上更复杂,但是comboBox的值(不需要是comboBox)在执行刷新之前不可用。这只是新文档首次获得默认值时出现的问题

我补充说:

view.postScript("XSP.partialRefreshGet('#{id:displayPanel}')")
对每一个页面事件,但它似乎不会执行实际的页面刷新,如单击按钮或进行更改

我不知道如何使这项工作成功。如果我能用这个简单的例子,剩下的我需要的就很容易了


谢谢

Fredrik的做法是正确的——您应该在活动期间手动设置值——但我要补充两个注意事项:

  • 调用
    setValue
    而不是
    replaceItemValue
    (例如
    document1.setValue(“myComboBox”,“默认值”);
    )。比较优势可能不适用于这种特定情况,但您应该习惯于总是调用
    setValue
    而不是
    replaceItemValue
    (和
    getValue
    而不是
    getItemValue
    ),这样,当您遇到一个真正不同的场景时,你只需免费获得福利。。。其余时间,这些方法是等效的,因此您最好只使用需要较少键入的方法。:)
  • 您可能需要在
    afterPageLoad
    中执行此操作:在
    beforePageLoad
    期间,数据源可能尚未就绪;根据您在页面其他位置引用默认值的原因,
    beforeRenderResponse
    可能太晚了;而且
    afterRenderResponse
    肯定太晚了
…这让我想到了为什么
defaultValue
属性的行为与我们期望的不一样,特别是对于我们这些有开发Notes客户端应用经验的人来说

XPages引擎将每个HTTP请求的处理分成几个“阶段”。根据请求类型(初始页面加载、部分刷新事件等)和其他因素,生命周期将由多达6个阶段和2个阶段组成

对这些阶段进行了很好的描述,但在这个问题的背景下,以下内容特别令人感兴趣:

  • 应用请求值

    当事件针对已加载的页面运行时(例如,用户单击按钮,或从具有
    onChange
    事件的组合框中选择值等),发送到服务器以触发事件的HTTP请求包括表示所有可编辑组件的值的POST数据。此阶段将这些值临时存储在任何受影响组件的
    submittedValue
    属性中,但数据源尚不“知道”新值是什么

  • 流程验证

    此阶段运行任何适用的验证器,如果任何验证器失败,则直接跳到最后一个阶段(这意味着它从未运行所触发事件的代码)

  • 更新模型值

    如果没有验证失败(或未定义任何验证),此阶段将获取提交的值并实际将其存储在相应的数据源中。在此之前,数据源完全不知道存在任何用户交互。这是为了避免用户输入可能无效而过早地污染任何后端数据。记住,不是每个数据源都是“文档”;它可能是通过
    UPDATE
    更改的关系数据,即时
    setValue
    被称为。。。这就是这个阶段的基本功能:它获取
    submittedValue
    并调用相应数据源上的
    setValue
    (然后将
    submittedValue
    设置为
    null
    )。这种分离允许组件只是后端数据状态的可视化表示——用户交互的可视化表示;我们的代码应该始终通过数据源的抽象层直接与后端数据交互

  • 呈现响应

    所有其他阶段运行(或跳过)后,此阶段将向使用者发送响应。换句话说,它将HTML(或JSON、XML或PDF等)发送回浏览器。但在这个问题的上下文中,最突出的一点是,在初始页面加载时总是跳过前面的阶段。当用户第一次访问页面时,他们还没有机会输入任何数据,因此没有要应用的请求值。由于没有发布任何数据,因此没有需要验证的内容。而且——最重要的是——没有什么可以推送到数据模型。因此,组件树的表示(或其子集,在部分刷新事件的情况下)始终需要发送给用户,但在用户与该表示交互之前,数据源将保持在呈现最新响应时的任何状态。。。这就是为什么,如果您希望数据源的特定属性在用户与它交互之前具有特定值,那么您的代码将