我有一个相对较快的 SproutCore 应用程序,我正试图让它更快一点。
现在,当用户滚动我的 SC.ListView 并滚动查看一些尚未从服务器加载的列表项(例如从关系中加载)时,应用程序会自动调用服务器以加载这些记录。尽管这很快,但我的列表项仍有一小段时间是空白的。
我知道我可以让他们说“正在加载...”或类似的东西(我有),但我想知道:有没有办法预加载我的“屏幕外”记录,以便在用户滚动时,列表项已经加载?
我的 ListItemViews 将相当大(以像素为单位),因此从 AJAX 的角度来看,即使加载两倍的数据量也不会成为杀手,如果用户滚动时总是加载内容会很好(除非他们滚动 SUPER-SUPER-fast,在这种情况下,我可以让他们看到加载指示器)。
我目前通过将以下内容添加到我的 SC.ListView 找到了解决方案,但我注意到移动设备上的一些主要性能问题,它们与进行此更改直接相关,所以我想知道是否有更好的方法。
contentIndexesInRect: function(rect) {
rect.height = rect.height * 2;
return sc_super();
}
最佳答案
覆盖 contentIndexesInRect 是我这样做的方式。不过,我不会将其翻倍——我可能会从 sc_super() 获得结果,然后将一些额外的项目添加到结果索引集中。 (我相信它会重新卡住,因此您可能必须克隆-编辑-卡住。)额外的一两个可能会给您足够的喘息空间来加载内容,而不会对明显的性能问题造成几乎同样的影响。
我很惊讶它会导致主要的性能问题。在我看来,您的列表项本身可能比它们需要的重量更重——例如,它们可能有很多绑定(bind)可以钩住和解开。如果这是正在发生的事情,您可能会从提高他们的效率中受益更多。
关于scroll - 如何在 SproutCore ListView 中预加载项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20010499/