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
}
}

 

ExtJS 等待两个/多个store加载完再执行操作的方法的更多相关文章

  1. js页面加载完后执行(document.onreadystatechange 和 document.readyState)

    js页面加载完后执行javascript(document.onreadystatechange 和 document.readyState) document.onreadystatechange ...

  2. 页面框架加载完自动执行函数$(function(){});

    页面中有一些大的资源文件,如图片,声音等,如果一个事件绑定写在这些加载资源代码的下方,那么要等资源加载完才会绑定,这样体验不够好. 于是想不等资源加载完,只要框架加载完成就绑定事件,就可以把代码放在以 ...

  3. spring boot容器加载完后执行特定操作

    有时候我们需要在spring boot容器启动并加载完后,开一些线程或者一些程序来干某些事情.这时候我们需要配置ContextRefreshedEvent事件来实现我们要做的事情 1.Applicat ...

  4. javascript 实现页面加载完再显示页面

    document.onreadystatechange = function () { if (document.readyState == "complete") { docum ...

  5. angular先加载页面再执行事件,使用echarts渲染页面

    剧情重现: 在一个页面中有多个小模块,这几个模块是可以拖动调顺序的,并且其中有两个模块使用了echarts渲染, 调整顺序angular插件有成熟的解决方案angular-sortable,https ...

  6. 图片加载完后执行js

    <script>            window.onload=function(){                          var liwidth = $('.imgul ...

  7. js中defer实现等文档加载完在执行脚本

    我们可以使用defer来实现类似window.onload的功能: <script src="../CGI-bin/delscript.js" defer></s ...

  8. 页面自动执行(加载)js的几种方法

    https://www.cnblogs.com/2huos/p/js-autorun.html 一.JS方法1.最简单的调用方式,直接写到html的body标签里面: <html> < ...

  9. js中页面加载完成后执行的几种方法及执行顺序

    在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...

随机推荐

  1. .NET的三种缓存(页面缓存,控件缓存,自定义缓存)

    BLL.Area bll = new BLL.Area(); protected void Page_Load(object sender, EventArgs e) { if (Cache[&quo ...

  2. CSS垂直水平居中方法整理

    CSS定位中常常用到垂直居中,比如覆盖层上的弹框. 兼容性比较好的方法: <!DOCTYPE html PUBliC "-//W3C//DTD XHTML 1.0 Transition ...

  3. 运用Ntop监控网络流量(视频Demo)

    运用Ntop监控网络流量 ____网络流量反映了网络的运行状态,是判别网络运行是否正常的关键数据,在实际的网络中,如果对网络流量控制得不好或发生网络拥塞,将会导致网络吞吐量下降.网络性能降低.通过流量 ...

  4. Cordova V3.0.0中config.xml配置文件的iOS Configuration

    http://www.cnblogs.com/lovecode/articles/3305655.html   轉載這個 <preference> 关于这个标签的可用设置有: Disall ...

  5. WF4 持久化 <第四篇>

    一.基础示例 WF4 默认支持SQLServer的持续化,首先要执行目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en下的脚本: SqlPer ...

  6. WP_3种磁贴效果设置

    private void ApplicationBarIconButton_Click_1(object sender, EventArgs e) { var tileData = new FlipT ...

  7. C++ Builder技巧集锦

    /* 调用DOS程序时不显示窗口 使 用 ShellExecute调 用 DOS程 序 时 可 以 不 显 示 窗 口 , 如 :*/ ShellExecute(, "open", ...

  8. 阿里 Java面试 知识点

    摘自: http://blog.csdn.net/wtyvhreal/article/details/45291835 =================================== 基础知识 ...

  9. SQL笔记-第二章,数据表的创建和管理

    数据类型 分5类:整数.数值.字符相关.日期时间以及二进制 1.整数 数据库系统 类型 说明 MYSQL tinyint [unsigned] 一个很小的整数.有符号的范围是-128 到127,无符号 ...

  10. PHP开发大型项目的一点经验

    一.变量 最好是把所有的变量存储在一个数组中,这样在程序的开发中可以带来很多的方便,特别是当程序很大的时候.变量的命名就当适合自己的习惯,不管是用拼音还是英语,至少应当有一定的意义,以便适合记忆.变量 ...