刷新新文档,以便默认显示在计算控件中

Bil*_*l F 0 default refresh xpages

这个问题一直困扰着我,我似乎无法绕过它.所以我把它剥离到最基本的水平.1.创建一个新的XPage并将其绑定到一个退出的表单2.创建一个名为'displayPanel'3的面板.在面板内创建一个comboBox并给它一些值和任何有效值的默认值.4.设置一个onChange事件,该事件执行部分刷新displayPanel 5.添加一个只显示comboBox值的计算字段.6添加了一个按钮,用于部分刷新displayPanel onClick.

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

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

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

我添加了这个:

view.postScript("XSP.partialRefreshGet('#{id:displayPanel}')")
Run Code Online (Sandbox Code Playgroud)

对于每个页面事件,但它似乎没有像点击按钮或进行更改那样进行实际的页面刷新.

我对如何使这项工作感到茫然.如果我能够通过这个简单的例子来完成我需要的其余部分就很容易了.

谢谢

Tim*_*ony 5

Fredrik走在正确的轨道上 - 您应该在活动期间手动设置值 - 但我会添加两个警告:

  • 打电话setValue而不是replaceItemValue(例如document1.setValue("myComboBox", "Default Value");).比较优势可能不适用于这种特定情况,但你应该养成一直调用setValue而不是replaceItemValue(而getValue不是getItemValue)的习惯,这样当你遇到一个真正不同的场景时,你就会得到它免费获益...剩下的时间,这些方法是等价的,所以你也可以只使用那种需要较少打字的方法.:)
  • 您可能需要这样做afterPageLoad:数据源可能尚未准备好beforePageLoad; 取决于您在页面的其他位置引用默认值的原因,beforeRenderResponse可能为时已晚; 并且afterRenderResponse肯定是来不及了......

......这使我为什么defaultValue属性不表现我们可以期待它的方式,尤其是对于我们这些有经验的开发Notes客户端应用程序.

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

本教程页面提供了对这些阶段的出色描述,但在本问题的上下文中,以下内容特别值得关注:

  • 应用请求值

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

  • 流程验证

    此阶段运行任何适用的验证器,如果有任何失败,则直接跳到最后阶段(这意味着它永远不会运行被触发的事件的代码).

  • 更新模型值

    如果没有验证失败(或者没有定义),则此阶段将获取提交的值并实际将它们存储在相应的数据源中.在此之前,数据源完全没有意识到存在任何用户交互.这旨在避免使用甚至可能无效的用户输入过早地污染任何后端数据.请记住,并非每个数据源都是"文档"; 它可能是通过调用UPDATE瞬间改变的关系数据setValue...这基本上就是这个阶段的作用:它接受submittedValue和调用setValue相应的数据源(然后设置submittedValuenull).这种分离允许组件简单地成为后端数据状态的可视化表示 - 用户与之交互的可视表示; 我们的代码应始终通过数据源的抽象层直接与后端数据进行交互.

  • 渲染响应

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

总之,组件是可视的.数据源是抽象的.也许,这种行为会更不言自明,如果组件的属性是被人称为defaultClientValue代替defaultValue,因为这是本质上它是什么:一个默认的建议给用户的哪些数据发送回数据源.但在他们这样做之前,数据源还没有收到这个值.因此,如果在初始页面加载时,您需要一个数据源属性,使其具有默认状态下不具有的值,则应手动调用setValue以使其具有所需的值.

PS具有讽刺意味的是,如果你打电话partialRefreshPost而不是partialRefreshGet,你很可能会达到你想要的结果,因为前者发送所有的表单数据,而后者只是要求再次渲染现有的组件状态.但是,你强制要发送所有表单数据只是为了更新一个数据源属性,所以最好简单地执行上面描述的操作.