我正在创建一个 GWT 应用程序,其中使用 aCellList
和 a显示元素列表ListDataProvider
。我想在每个单元格中显示的数据只包含两个字符串。我创建了一个从AbstractCell
. 为了创建我的自定义单元格,我使用了 UIBinder 并基于 HTML 创建了 UI。每个单元格包含两个字符串和一个按钮。单击该按钮会从绑定列表中删除该元素。在我的分辨率下,大约有 20 个元素是可见的,所以我将页面大小设置为 30,以便在用户想要向下滚动时有一点“缓冲区”。前三个元素如下所示:
http://imageshack.us/f/201/listox.png/
在 tomcat 上运行已部署的应用程序时没有问题。但是在开发模式下运行时,我在删除元素时注意到以下问题:
- 我单击第一个元素的“删除元素”按钮
- 我再次单击第一个元素的“删除元素”按钮(而第一个元素仍然可见)
- 从列表中删除第一个元素
- 第二个元素也从列表中删除
我对已部署的版本进行了相同的尝试,但是我无法单击第一个元素的“删除元素”按钮两次,因为它被删除得太快了。所以我将显示元素的数量增加到 500,这导致了同样的问题。我切换到较慢的系统(1GHz 的 AMD G-T40R),同样的情况发生在我将页面大小设置为 50 或更大。
为了进一步深入研究这个问题,我在自定义 Cell的方法中添加了一个NativePreviewHandler
并安排了一个ScheduleCommand
via ,以查看发生了什么。这是结果(在开发模式下运行,Chrome 27.0.1438.7 dev-m,添加了检查订单的时间戳):Scheduler.get().scheduleDeferred
onBrowserEvent
- 在 1363340977109 mousedown (在第一个元素的“删除元素”按钮上)
- 在 1363340977206 mouseup (在第一个元素的“删除元素”按钮上)
在 1363340977225 单击(在第一个元素的“删除元素”按钮上)
在 1363340981341 scheduleDeferred in onBrowserEvent
在 1363340981366 mousedown (在与第一次单击相同的位置,但现在在第二个元素的“删除元素”按钮上,因为第一个元素已被删除)
- 在 1363340981386 mouseup (在第二个元素的“删除元素”按钮上)
在 1363340981394 单击(在第二个元素的“删除元素”按钮上)
在 1363340985184 scheduleDeferred in onBrowserEvent
这里的问题是:第二次点击是否真的以某种方式“缓冲”了,因为浏览器正忙于渲染/(重新)绘制内容。有没有办法确定渲染何时完成或在浏览器忙碌时禁用用户输入?
我当前的解决方案/解决方法:删除元素时禁用按钮。所以点击被忽略。为了模拟浏览器完成渲染,我在执行后添加了一定的时间(~50ms)ScheduleCommand
。然后我再次启用所有按钮。这暂时有效,但如果有一天浏览器缓冲输入超过 50 毫秒,问题会再次出现。