| 本案例由 捷永信息 毛必炬 提供 Email: maobiju@ginyong.com QQ:15380805 | ![]() |
<script type='text/javascript' src='dynaload.js?20'></script>但是我们想把硕正套件封装成 ExtJS 的组件来随时能使用,额外加上这么一句显得非常别扭。且 ExtJS 都是 OnePage 的应用,很多时候我们并不想一开始就把什么东西都列入加载项,而是希望能够 lazyload。经过反复试验,发现可以利用 ExtJS 的动态加载机制实现。实现步骤如下:
Ext.define('resources.supcan.dynaload',{});
c).在封装组件的定义 requires 处增加语句: Ext.define('gp.util.form.SupcanImpl', {
requires:['resources.supcan.dynaload'
,'gp.wf.editor.util.XmlUtil'
,'gp.store.form.FrmFlds'
,'gp.store.form.FrmTbls']
这样 gp.util.form.SupcanImpl 组件被加载时就能动态加载dynaload.js,且 ExtJS 的加载机制能保证即使多处使用组件也不会出现重复加载的问题。Ext.useShims = true;默认情况向是false, 文档说明中提到当使用到 flash 等插件且是 IE 时,可能需要设置为true。
Ext.define(‘myPanel’,{
Items:[
{
hideMode:'asclass',
layout:’fit’,
html:’ insertTreeList(id,para)’
}
]
});
不过实际应用中发现,上述模式在单独使用时没有问题,但是 ExtJS 的 UI 组件往往是多层嵌套的,那这种模式也会时常失灵。通过多次反复观察 render 后的 html 代码与实验, 最后总结出一种模式能较为彻底解决问题,同样以Panel为例:
Ext.define(‘myPanel’,{
Items:[
{
hideMode:'asclass',
layout:’fit’,
Items:[{
html:’ insertTreeList(id,para)’
}]
}
]
});
注意与前例的对比,关键就是在 hideMode:'asclass' 所在层,将硕正套件单独加在一个内层中。这样 myPanel 无论被用在什么地方都不会出现控件被浏览器销毁的情况。
var typeid; if($isIE==false) typeid = 'type="application/supcan-plugin" Codebase="' +SupcanPath+ 'supcan.xpi"'; else typeid = 'CLASSID="clsid:619F1AC0-2644-40D3-9EB1-22F81C5FE097" Codebase="' +SupcanPath+ 'supcan2.cab#Version=1,0,0,3"';修改思路: 硕正套件判断是否IE,否则就是FireFox, 把这段判断改成是否 FireFox 否则就是IE (ActiveX for Chrome其实是让插件认为自己是在 IE 里面运行!).