【问题标题】:partial update on onChange event don't get the correct valueonChange 事件的部分更新没有得到正确的值
【发布时间】:2013-04-03 19:20:37
【问题描述】:

我在 xpage 中构建了一个搜索功能,用户可以在其中从列表框和组合框中选择值,而 ftsearch 查询由这些值组成。因此,当我更改组合框的值时,会触发 onChange 事件,并对结果视图进行部分更新。问题是视图根据onChange之前组合框的先前值显示结果。就像视图中的结果总是落后一个变化。

我在事件中添加了 try/catch,但没有出现异常。这似乎是一种非常奇怪的行为。有没有人经历过这样的事情?

我将不胜感激任何想法和方向,因为我现在对问题可能是什么感到困惑。

提前非常感谢!

【问题讨论】:

  • 您能否创建一个示例 XPage 并发布代码。
  • 详细介绍 Simon 的评论:如何将 ftsearch 字符串传递到视图的搜索属性中?你在使用视图面板吗?
  • 是的,我正在使用视图面板并将 ftsearch 字符串传递给它的搜索属性。 ftsearch 字符串是通过从列表框和组合框获取值组成的。 @SimonO'Doherty 恐怕代码很复杂,从这里很容易阅读。
  • 不需要完整代码。尝试在空白 nsf 中创建一个示例,看看会发生什么。
  • 这是在提交值应用于模型之前使用存储值时的常见问题。 JSF 生命周期中的更多信息。您可以尝试获取“提交的价值”而不是“价值”。或者改变你搜索的方式,看起来你的搜索顺序不对。

标签: xpages onchange


【解决方案1】:

我只是以一种非常简单的方式试了一下,它对我有用。这是我所拥有的:

  1. 确保我的数据库已被 ft 索引!!
  2. 创建一个 id = "viewPanel1" 的 viewPanel
  3. 将 viewPanel 链接到视图数据源
  4. 使用以下代码为我的 viewPanel 创建一个计算搜索属性:

    requestScope.get("fts");

  5. 创建一个组合框(在视图面板上方)

  6. 将组合绑定到我的 requestScope 变量“fts”
  7. 用适当的值填充组合的选项列表
  8. 让组合的 onchange 事件执行部分更新并将其链接到我的 viewPanel(ID:viewPanel1)

在我的情况下,我的视图中有一个测试文档,其主题字段具有“sub 1”、“sub 2”、...、“sub 6”等值。所以我让我的组合为我提供选项“1”...“6”。

如果我想更具体地使用我的 ft 搜索字符串,我可以在 viewPanel 的搜索属性中像这样构建它(第 4 步):

if(requestScope.containsKey("fts") && requestScope.get("fts")!=""){
    "Sub " + requestScope.get("fts");
}

就是这样 - 有效。

如果我弄错了您的问题,请告诉我们。在这种情况下,您需要更具体地说明您正在尝试做什么以及到目前为止您尝试了什么。

编辑:
根据您的评论,我在我的组合中添加了一个列表框。我看到 listBox 本身并没有做任何坏事,但是我当然必须注意两者不要互相干扰。所以这是我为解决这个问题所做的:

  1. 将我的组合框绑定到另一个名为“ftsCombo”的 requestScope var
  2. 将我的 listBox 绑定到“ftsList
  3. 两个控件具有相同的选项列表(见上文;当然您可以使用不同的选项,我只是懒得想不同的值...),并且它们正在执行部分更新 onchange
  4. 为了能够控制结果,我在 viewPanel (id = "tgtPanel") 周围创建了一个命名面板,并将部分更新规则更改为以面板为目标
  5. 在视图上方的面板中,我创建了 2 个计算字段,每个都绑定到我的一个 requestScope 变量 (ftsCombo / ftsList),以便我查看范围内的内容onchange 触发后
  6. 在两个 onchange 事件中,我还编写了一个简短的 SSJS 代码 sn-p 清除“另一个”变量,这样两者就不会进入对方的 方式:

(组合改变:)

requestScope.remove("ftsList");  

(列表更改:)

requestScope.remove("ftsCombo"); 

最终将视图的计算搜索属性更改为:

if(requestScope.containsKey("ftsCombo") && requestScope.get("ftsCombo")!=""){
return "Sub " + requestScope.get("ftsCombo");
}
if(requestScope.containsKey("ftsList") && requestScope.get("ftsList")!=""){
 return "Sub " + requestScope.get("ftsList");
}

所以现在我可以使用组合列表来应用过滤器

【讨论】:

  • 感谢您的宝贵时间和帮助!我创建了一个带有列表框、组合框和视图的新 xpage。当有列表框而不仅仅是组合框时,似乎我的问题就会出现。我认为这个问题与@Frantisek Kossuth 在上面的评论中所说的有关。因为当我将列表框添加到 xpage 时,我似乎总是在 onChange 事件之前获取值。
  • 再次感谢您!我会试试。目前我没有使用范围。例如,我通过 combo1.getValue() 获取值。也许这就是问题所在。
  • 好的,我想这就解释了。使用瞄准镜试一试。 - 顺便说一句:我将两个字段控件都放在更新的面板之外;但是,如果你把它放在里面,你很可能甚至不需要像我一样删除变量(我编辑版本中的第 6 步);我认为这两种方法各有优势。
  • 我尝试了您的方法,直到现在它仍然有效,并且我在第一种方法中遇到的问题不再出现。非常感谢!似乎使用范围更好。
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2019-07-20
  • 1970-01-01
  • 2022-10-19
  • 2022-08-16
  • 1970-01-01
相关资源
最近更新 更多