Javascript 使用大数据源迭代ExtJS 3.1 GridPanel

Javascript 使用大数据源迭代ExtJS 3.1 GridPanel,javascript,extjs,Javascript,Extjs,我有一个GridPanel(代码中的var agentGrid)绑定到JsonStore(代码中的var agentDataStore)。此商店有一个显示计时器的字段,该计时器指示客户服务代理处于状态的时间。因此,每隔15秒我就会触发一个事件(使用setInterval()),通过迭代JsonStore并更新相应字段来更新每行的计时器 下面是每15秒触发一次的事件: 代码: 然而,一旦我在JsonStore中获得了大约120个代理,页面就开始冻结,firefox告诉我,我的脚本编写时间太长了 所

我有一个GridPanel(代码中的var agentGrid)绑定到JsonStore(代码中的var agentDataStore)。此商店有一个显示计时器的字段,该计时器指示客户服务代理处于状态的时间。因此,每隔15秒我就会触发一个事件(使用setInterval()),通过迭代JsonStore并更新相应字段来更新每行的计时器

下面是每15秒触发一次的事件:

代码:

然而,一旦我在JsonStore中获得了大约120个代理,页面就开始冻结,firefox告诉我,我的脚本编写时间太长了

所以,我的问题是: 是否有更好的方法在GridPanel(绑定到JsonStore)的每一行中实现计时器?我意识到迭代不是一个有效的过程,但是我如何才能更新每一行呢?记住,我需要显示每个代理的状态。
我想200行不应该更新那么多,但也许是这样?

您肯定可以使用
Ext.util.TaskRunner
类进行更新。我可以想到的一种避免“for each循环”的方法是扩展
Ext.data.Record
以拥有一个新事件,并将TaskRunner的实例附加到每个记录,并且在每个时间间隔触发更新事件。因此,一个特定的记录被更新

副作用是,您的存储中的每条记录都有200个TaskRunner对象。我们可以利用singleton实例吗?我认为你应该能够补充这个想法并提出解决方案

function agentTimerTick() {
    var newTime = getStateTime(); //assume this always works
    agentDataStore.each(function (rec) {
        rec.set('statetimedisplay', newTime); //set the field of the JsonStore to the timer value
    });
    agentDataStore.commitChanges();
}