这个问题一直困扰着我,我似乎无法绕过它。所以我把它剥离到最基本的水平。 1.创建一个新的XPage并将其绑定到一个退出的表单 2.创建了一个名为'displayPanel'的面板 3.在面板内创建一个comboBox,并为其指定一些值和任何有效值的默认值。 4.设置一个onChange事件,用于部分刷新displayPanel 5.添加一个只显示comboBox值的计算字段。 6添加了一个按钮,用于部分刷新displayPanel onClick。
打开XPage,计算字段为空,进行更改并显示计算字段。
再次打开XPage并单击刷新按钮,显示计算字段
现在这是一个非常简单的例子,但我需要做的事情实际上更复杂,但是在执行刷新之前,comboBox的值(不需要是一个comboBox)是不可用的。这只是新文档首次获得默认值时的问题。
我添加了这个:
view.postScript("XSP.partialRefreshGet('#{id:displayPanel}')")
每个页面事件但似乎没有像点击按钮或进行更改那样进行实际的页面刷新。
我对如何使这项工作感到茫然。如果我可以通过这个简单的例子来完成我需要的其余部分就很容易了。
由于
答案 0 :(得分:5)
Fredrik走在正确的轨道上 - 您应该在活动期间手动设置值 - 但我会添加两个警告:
setValue
而非replaceItemValue
(例如document1.setValue("myComboBox", "Default Value");
)。比较优势可能不适用于这种特定情况,但您应该养成始终呼叫setValue
而不是replaceItemValue
(以及getValue
而不是getItemValue
)的习惯当你遇到一个真正有意义的场景时,你就可以免费获得这个好处......剩下的时间,这些方法是等价的,所以你不妨只使用那个需要的方法。减少打字。 :)afterPageLoad
中执行此操作:在beforePageLoad
期间,数据源可能尚未就绪;根据您在页面中其他位置引用默认值的原因,beforeRenderResponse
可能为时已晚;而afterRenderResponse
肯定会来不及...... ...这导致我 为什么 defaultValue
属性的行为不符合我们的预期,特别是对于我们这些有经验的人开发Notes客户端应用程序。
XPages引擎将每个HTTP请求的处理分为几个阶段"。根据请求的类型(初始页面加载,部分刷新事件等)和其他因素,生命周期将包含多达6个阶段,最少2个阶段。
This tutorial page提供了对这些阶段的精彩描述,但在这个问题的背景下,以下是特别感兴趣的:
应用请求值
当事件针对已经加载的页面运行时(例如,用户单击按钮,或从具有onChange
事件的组合框中选择值等),HTTP请求将发送到触发事件的服务器包括表示所有可编辑组件的值的POST数据。此阶段会将这些值临时存储在任何受影响组件的submittedValue
属性中,但数据源不会知道"新的价值是什么。
流程验证
此阶段运行任何适用的验证器,如果有任何失败,则直接跳到最后阶段(这意味着它永远不会运行被触发事件的代码)。
更新模型值
如果没有验证失败(或者没有定义),则此阶段将获取提交的值并实际将它们存储在相应的数据源中。在此之前,数据源完全没有意识到存在任何用户交互。这旨在避免使用甚至可能无效的用户输入过早地污染任何后端数据。请记住,并非每个数据源都是"文档&#34 ;;它可能是通过调用UPDATE
的{{1}} setValue
更改的关系数据...这基本上就是这个阶段的作用:它需要submittedValue
并调用setValue
在相应的数据源上(然后将submittedValue
设置为null
)。这种分离允许组件简单地成为后端数据状态的可视化表示 - 用户与之交互的可视表示;我们的代码应始终通过数据源的抽象层直接与后端数据进行交互。
呈现回复
一旦所有其他阶段都已运行(或被跳过),此阶段就会向消费者发送响应。换句话说,它将HTML(或JSON,或XML,或PDF等)发送回浏览器。但是在这个问题的上下文中最突出的一点是,在初始页面加载时,先前的阶段总是被跳过。当用户首次访问页面时,他们还没有机会输入任何数据,因此不会应用任何请求值。由于没有发布数据,因此无需验证。并且 - 最相关的 - 没有什么可以推送到数据模型。因此,总是需要将组件树(或部分刷新事件的子集)的表示发送给用户,但是直到用户与该表示交互,数据源仍然处于呈现最新响应时的状态...这就是为什么,如果您希望数据源的特定属性在用户与之交互之前具有特定值,您的代码需要手动设置该属性的值。
总之,组件直观。数据来源抽象。如果组件属性只是被称为defaultClientValue
而不是defaultValue
,那么这种行为可能会更加不言自明,因为它基本上就是这样:对用户的默认建议 将哪些数据发回到数据源。但在他们这样做之前,数据源还没有收到这个值。因此,如果在初始页面加载时,您需要数据源属性具有其默认状态下不具有的值,则应手动调用setValue
以使其具有所需的值。
PS 具有讽刺意味的是,如果你打电话给partialRefreshPost
而不是partialRefreshGet
,你可能会达到你想要的结果,因为前者发送了全部表单数据,而后者只是要求再次呈现现有的组件状态。但是,您强制所有表单数据只是为了更新一个数据源属性,所以最好简单地执行上述操作。< / p>