zoukankan      html  css  js  c++  java
  • ExtJS 等待两个/多个store加载完再执行操作的方法

    ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架。

    Extjs加载Store是异步加载的,这有很多好处。但是当我们要在两个或多个不同的store加载完再执行一些操作时,异步加载就成了一个问题。在Stack Overflow 等网站搜集并试用了几个处理方法,总结如下。

    1、自己定义一个组件

    Ext.define(‘Ext.ux.StoreLoadCoordinator‘, {
    mixins: {
        observable: ‘Ext.util.Observable‘
    },
    resetStoreLoadStates: function() {
        this.storeLoadStates = {};             
    
        Ext.each(this.stores, function(storeId) {
            this.storeLoadStates[storeId] = false;
        }, this);      
    },   
    isLoadingComplete: function() {
        for (var i=0; i<this.stores.length; i++) {
            var key = this.stores[i];
    
            if (this.storeLoadStates[key]==false) {
                return false;
            }
        }
    
        return true;       
    },   
    onStoreLoad: function(store, records, successful, eOpts, storeName) {
        this.storeLoadStates[store.storeId] = true;
    
        if (this.isLoadingComplete()==true) {
            this.fireEvent(‘load‘);
            this.resetStoreLoadStates();
        }
    },   
    constructor: function (config) {
        this.mixins.observable.constructor.call(this, config);
    
        this.resetStoreLoadStates();
    
        Ext.each(this.stores, function(storeId) {
            var store = Ext.StoreManager.lookup(storeId);
    
            store.on(‘load‘, Ext.bind(this.onStoreLoad, this, [storeId], true));
        }, this);
    
        this.addEvents(
            ‘load‘           
        );
    }});

    使用的时候把两个不同的store,作为参数传过去。

    var store1 =  Ext.create(‘Ext.data.Store‘, {
        storeId: ‘Store1‘,
        .... (rest of store config)
    }});       
    
    var store2 =  Ext.create(‘Ext.data.Store‘, {
        storeId: ‘Store2‘,
        .... (rest of store config)
    }});       
    
    
    var coordinatior = Ext.create(‘Ext.ux.StoreLoadCoordinator‘, {
        stores: [‘Store1‘, ‘Store2‘],
        listeners: {
            load: function() {
               // Do post-load work
            }
        }
    });        

    2、使用setInterval

    var bChartArr =[false, false, false, false]; 
    //加载图表轴 
    Ext.getStore("ChartAxes").load( 
    { 
        params:{ queryId:queryId }, 
        callback:function(){ 
            bChartArr[0] = true; 
        } 
    }); 
    //加载图表序列 
    Ext.getStore("ChartSeries").load( 
    { 
        params:{ queryId:queryId }, 
        callback:function(){ 
            bChartArr[1] = true; 
        } 
       
    }); 
    //加载图表样式 
    Ext.getStore("ChartStyle").load( 
    { 
        params:{ queryId:queryId }, 
        callback:function(){ 
            bChartArr[2] = true; 
        } 
    }); 
    // 按钮 
    Ext.getStore("Buttons").load( 
    { 
        params:{query_id:queryId}, 
        scope:this, 
        callback:function(){ 
            bChartArr[3] = true; 
        } 
    }); 
    var me = this; 
    // 等待所有的Storoe加载完成后执行 
    var timer = setInterval(function(){ 
        if(bChartArr[0] && bChartArr[1] && bChartArr[2] && bChartArr[3]){ 
            clearInterval(timer); // 清除等待 
            // 解析图表样式、轴、序列动态生成图表 
            me.createChartPanel(); 
        } 
    },100);  

    3、与方法二类似

    var store1 = Ext.create(‘Ext.data.Store‘, {
        model: myModel,
        storeId: ‘store1‘, //<-- adds this to Ext.data.StoreManager
        proxy: {
            type: ‘ajax‘,
            url: ‘url...‘,
            reader: ‘json‘
        },
        autoLoad: {
            callback: initData
        }
    });
    
    var store2 = Ext.create(‘Ext.data.Store‘, {
        model: myModel,
        storeId: ‘store2‘,
        proxy: {
            type: ‘ajax‘,
            url: ‘url...‘,
            reader: ‘json‘
        },
        autoLoad: {
            callback: initData
        }
    });
    
    // Initialize store dependencies when all stores are loaded
    function initData() {
        var loaded;
        Ext.data.StoreManager.each( function(store) {
           loaded &= !store.isLoading();  
            return loaded;
        });
        if(loaded) {
            // do stuff with the data
        }
    }

     

  • 相关阅读:
    Java基础知识强化之IO流笔记77:NIO之 Selector
    Java基础知识强化之IO流笔记76:NIO之 Channel(通道)之间的数据传输
    Java基础知识强化之IO流笔记75:NIO之 Scatter / Gather
    Java基础知识强化之IO流笔记74:NIO之 Buffer
    Java基础知识强化之IO流笔记73:NIO之 Channel
    Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)
    谈谈数据库连接池
    纯JSP实现简单登录跳转
    快速查找无序数组中的第K大数?
    新版汉诺塔(UVa10795
  • 原文地址:https://www.cnblogs.com/walter371/p/4828902.html
Copyright © 2011-2022 走看看