【发布时间】:2013-11-18 11:15:46
【问题描述】:
我有一个大的“订单”XPage,它显示 99 行,每行有 3 个文本输入框。 为了捕捉变化,我在每个输入框的“onchange”事件中调用了一个 SSJS 函数。 该调用仅发送产品 ID、更改类型(哪一列)和数量。 然后,SSJS 函数将这些更改保存在 sessionScope 变量 (java.util.HashMap) 中。 没有与更改关联的刷新。
当用户单击“提交”按钮时,更改会被整体处理。 这是另一个 SSJS 函数,它简单地将所有更改写入后端 Domino 数据库。
这一切似乎都运行良好,并且已经完成了几年。 但是,我的用户似乎在使用该应用程序时变得过于高效,并且打字速度快得跟不上。
我的调试代码将每个更改写入服务器的控制台,如果用户快速连续地进行更改(他们只是在输入框之间切换),我可以看到某些更改被简单地忽略了。就好像服务器忙于处理先前的更改并跳过一个移动到另一个。有时,整个更改块都会丢失,然后应用程序会在可能的情况下重新启动。
我是否使用了错误的技术来捕获更改?我可以做些什么来确保应用程序每次都启动 onchange 事件?
我已经使用 IE8/9 和 FF24 对此进行了测试。 我查看了其他建议使用“onkeyup”事件的帖子。我认为这对我来说行不通,因为用户可能会订购两位数的数量。
任何/所有建议将不胜感激!
【问题讨论】:
-
一次只能运行一个事件,因此如果在前一个事件仍处于挂起状态时触发了一个事件,它将自动阻止新事件。既然这些数据在“提交”之前什么都不会发生,为什么要为每个组件触发一个单独的更改事件?
-
感谢蒂姆的回复!抱歉,我错过了解释的关键部分......我需要存储用户在提交订单之前所做的更改,因为订单表单上有多个页面(不仅仅是最初的 99 行)。通过将每个单独的更改存储在 sessionScope 变量中,我可以在用户单击提交按钮时将它们一起提交。
-
对不起,再多一点来支持我在提交时“批处理”所有更改的理由 - 业务逻辑规定所有更改都必须一起处理。购买规则逻辑(多项目购买折扣、必须一起购买的项目等)包含在与 Notes 客户端共享的 LotusScript 库中,并且该库依赖于提交的更改的完整批次。
-
其实我并不是要说服你放弃批处理;相反,放弃个别处理。您现有的事件将信息放在会话范围内......相反,将整个界面(或至少重复)绑定到范围内的对象,当单击“提交”时,无论如何,您的范围都会自动更新涉及许多行。这基本上就是斯蒂芬的回答所说明的。
-
谢谢蒂姆-我明白了。我已经使用了 Stephan 的 cmets/code,并开始学习/开发托管 bean 解决方案。非常感谢您抽出宝贵时间进行解释,并期待在奥兰多为大家买一杯饮料!
标签: xpages onchange serverside-javascript