2

我有一个视图数据源,它使用视图键来访问文档并使用 var“posts”重复显示它们。在重复中,我有一个带有var“post”的文档数据源,它使用posts.getUniversalID()获取文档的unid。

再往下重复,我有另一个文档数据源“newcomment”,它是一个响应,并将父 ID 设为:post.getDocument().getUniversalID()

在 newcomment 数据源下方,我有一个编辑框和一个提交按钮,它使用 newcomment.save() 将评论保存为对“帖子”的响应

这是我的问题

两个人访问同一个 xpage。personA 进入页面并开始为帖子写评论。同时,personB 创建一个新帖子并在 personA 提交评论之前提交。现在发生的情况是,评论被绑定到最新的帖子,而不是 personA 回复的帖子。

我也尝试了另一件事,假设该数据库中有 10 个帖子。personA 和 personB 访问 xpages。personA 开始为 8 号帖子写评论。同时 personB 在数据库中创建了两个新帖子。当 personA 现在提交评论时,它似乎绑定到同一个索引,现在是两个帖子。但仍然是索引 8。这当然是错误的帖子。

如果我将重复更改为“createControlsAtPageCreation”,即repeatControls=true,评论将附加到正确的帖子,但随后我遇到了另一个问题,即视图未更新以显示最新帖子。

我的重复是使用 extlib 中的动态内容控件动态加载的自定义控件。

因为这里的信息是我发现的关于 repeatControls 设置的信息

  • 将 repeatControls 属性设置为 true 会指示重复控件为数据集上的每次迭代创建其子项的新副本。
  • 当使用属性 repeatControls=“true” 配置重复控件时,它只会在页面加载时重复其内容一次

所以我的问题是我不明白发生了什么。为什么我的评论附加到错误的父文档?有没有办法可以防止这种情况并且仍然可以正确显示新帖子

感谢您的帮助

4

2 回答 2

1

如果没有代码,很难想象这里到底发生了什么,但这看起来与我在重复控制和值绑定中遇到的问题非常相似。

长话短说,问题在于repeatControls 属性设置为false。当数据绑定仅适用于集合中的第一个元素时 - 所有数据都以某种方式神奇地保存到第一个对象!我设法通过结合使用动态内容控件重建和repeatControls 设置为true 来完成这项工作。只有那时数据绑定才是有效的属性。

看起来如果您只重复渲染(这就是 repeatControls 设置为 false 所做的),jsf 生命周期的解码阶段进入 foobar。

于 2013-03-12T16:50:30.573 回答
0

如果没有您的 XSP 标记,很难绝对确定,但您的应用程序代码似乎在页面加载期间每行创建和保存数据源和组件 - 因此也增加了组件树的整体大小和复杂性。您也应该尝试一种仅在最终用户请求时才延迟加载数据源的方法(例如:编辑/回复)。

有关使用这种动态方法的示例,请参阅 XPages 扩展库演示应用程序 (XPagesExt.nsf)。特别是,查看 Core_InPlaceForm.xsp,它演示了在 xp:repeat 中使用 xe:inPlaceForm 控件。另请参阅 Domino_ForumView.xsp,它演示了使用 xe:forumView 和 xe:forumPost 控件来管理和可视化分层线程。在实际保存任何给定的帖子或评论(失败、创建冲突、强制、异常)和针对高争用情况的文档锁定时,还要考虑最适合您要求的并发模式。上述控件都提供了最高级别的动态控制和数据源的创建和销毁。

请随时向我发送一个工作示例数据库,在那里我可以了解您的确切用例 - 给我发邮件或给我发电子邮件。

于 2013-03-19T11:58:36.703 回答