我有一种情况,我在FireFox 3.6+上的GWT网格中从服务器渲染项目。我有大约200个项目,我将它们加载到循环中:
users = myService.getUsers();
for(User user : users){
myPanel.addUser(user); // Pseudocode. Actually i add some labels and text fields...
}
在此循环中更改DOM
需要很长时间,因此我收到了“无响应脚本”通知。但我不能重构代码或分页,我需要一次加载1页上的所有200个项目。
有没有办法取消此通知?要通知浏览器我的脚本没有挂起,但做了一些有用的事情吗?
UPD Ok ,这是我的代码更接近。它是来自大项目的代码,我们有很多自定义组件,所以我认为它没有实际价值。
myService.getUsersDetails(searchCriteria, new MyCallback<List<User>>)
{
@Override
protected void response(List<User> result)
{
gridExpanderPresenter.clear();
int i = 0;
for (User user: result)
{
UserDetailsView detailsView = detailsViewProvider.get();
gridExpanderPresenter.setPresenter(UsersPresenter.this);
gridExpanderPresenter.add(detailsView.asWidget()); //Here is DOM manipulation i mentioned
if (i++ % 2 == 1)
{
detailsView.setOdd(); //Setting style here
}
detailsView.setData(user);
}
}
});
我认为this可以帮助我......
答案 0 :(得分:6)
您应该在将User
附加到DOM之前添加myPanel
,或者如果它已经附加并且需要更新,请从DOM中删除myPanel
,添加所有用户并重新附加{ {1}}。
在附加myPanel时添加200个用户会发生什么情况,您的浏览器必须更新DOM 200次,这非常昂贵(重新计算并重新绘制屏幕)。
答案 1 :(得分:4)
有几个选择:
Scheduler.scheduleIncremental
批量您的更新;不要一次只渲染10个用户(不用担心,Scheduler
会在产生之前连续多次运行代码,因此它实际上可以一次渲染50,100或150个用户,然后继续10ms(是,毫秒))
切换到CellTable
;这是一次重大的重构,但它会比基于小部件(Label
,TextBox
等)的其他任何内容提供更好的性能。