ExtJS等到所有模型都加载完毕

时间:2014-07-25 19:39:35

标签: extjs extjs4.2

我的ExtJS 4.2.1应用程序中有一个setTimeout,必须在store.each函数中的所有模型都被加载之前被触发:

checkProcessStatus: function() {
        console.log('check pending process status');
        var me = this,
            grid = me.getRequestGrid(),
            store = grid.getStore();

        //var inprocess = [];

        // get all pending processes
        store.each(function(rec) {
            if (rec.get('Status') == 0 || rec.get('Status') == 1) {
                //inprocess.push(rec);

                var id = rec.get('RequestProcessId');
                // has to check the status of each record
                var model = me.getCalculationRequestProcessModel(); // Ext.create('RequestProcessModel');
                model.getProxy().extraParams = {
                    requestProcessId: id
                };
                model.load(id, {
                    success: function(record, operation) {

                        var recToUpdate = store.getById(id);

                        // only if the status has changed then update grid
                        if (recToUpdate.get('Status') != record.get('Status')) {

                            recToUpdate.set(record.getData());

                            // refresh grid node
                            grid.getView().refreshNode(store.indexOfId(id));

                        }

                    }
                });


            }
        });

       // if all models were loaded correctly then call my timer function
       // run timer
       me.timer = setTimeout(Ext.bind(me.checkProcessStatus, me), 5000);


    },

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

终于找到了一个很好的解决方案:

我创建一个空数组:

var pendingRecs = [];
var totalPending = 0;

然后我循环存储并将匹配记录推送到pendingRecs数组:

store.each(function(rec) {
            if (rec.get('Status') == 0 || rec.get('Status') == 1) {
                // add only the processes that are pending or inpgrogress
                pendingRecs.push(rec);
            }
        });

然后我设置totalPending var:

totalPending = pendingRecs.length;

然后我运行for语句:

for (i = 0; i < pendingRecs.length; i++) {

            var rec = pendingRecs[i];

      // do stuff

      // load model

                  model.load(id, {

            success: function(record, operation) {

                var recToUpdate = store.getById(id);

                // only if the status has changed then update grid
                if (recToUpdate.get('Status') != record.get('Status')) {

                    recToUpdate.set(record.getData());

                    // refresh grid node
                    grid.getView().refreshNode(store.indexOfId(id));

                }

                totalPending--;
                // if this is the last record then run the timer again
                if (totalPending== 0) {

                    pendingRecs = null;
                    // run timer
                    me.timer = setTimeout(Ext.bind(me.checkProcessStatus, me), 5000);
                }

            }
        });
}

答案 1 :(得分:0)

虽然您可能对您找到的解决方案感到满意,但我认为这不是最佳解决方案。让我解释一下原因。

您需要(至少)一个请求才能将记录初始加载到store。然后,您遍历所有这些记录以挑选那些需要“进一步处理”的记录,并从执行success回调中的处理的服务器逐个加载它们。

现在,为什么服务器必须在只需要处理一些需求时提供所有记录?如果Ext可以决定处理的记录是什么,那么服务器就可以。

然后,知道要处理的其他记录,为什么不在一个请求中加载所有记录呢? (注意:保存服务器请求的数量确实值得,因为这是感觉应用程序缓慢的主要原因之一。)

同样,服务器可以测试要传送哪些记录以供进一步处理。