ExtJS和SilverLight的集成BUG
这又是个很奇怪的BUG
起因呢,是准备在框架里集成一个文件上传控件,考虑到要支持大文件(上G的文件)上传
一开始使用的是Ext.ux.UploadDialog这个专门为ExtJS写的文件上传控件,问题是这个控件在FF下文件上传完毕后始终显示错误(难得BUG不是出现在IE下),查了下原因,应该是IE和FF的Ajax机制不同造成的,看了好半天,不知道怎么改,还是放弃算了
然后呢,找了N多的SilverLight2-4的文件上传控件,最后找了个比较合适的,改了改,加了些JS控制代码以及回调函数进去,OK,可以了
下一步,集成到ExtJS的Window里
一开始使用SilverLight的一个SivlerLight Component模式集成,老出问题,后来干脆还是直接写HTML代码嵌入吧
代码时这样的:
items: [ new Ext.Panel({ frame: true, html: '<object id="silverlightfileupload" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"><param name="source" value="/ClientBin/FileUpload.xap"/><param name="background" value="white" /><param name="windowless" value="false" /><param name="minRuntimeVersion" value="2.0.31005.0" /> <param name="autoUpgrade" value="true" /><param name="initParams" value="UploadPage=http://localhost/ExtFileWeb/FileUpload.ashx,Filter=Images (*.jpg)|*.*" /><a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"><img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/></a></object>' }) ],
测试后,IE和FF下都没问题了,文件上传似乎不够快,不过还是比较稳定的(原本想法本地上传本机,速度应该呼啦啦的一秒不说几百兆,几十兆总该有的,但是实际运行保持在几兆每秒的速度,跟HTTP上传可能有关系吧)
继续测试,问题出现了,这次又是在该死的IE下......在IE下一拖动上传文件的窗口,控件里已选择的文件就神奇的消失了......
这个真的不知道怎么回事了,测试了N多遍,FF下就没问题,后台也没接收到任何事件,反正文件就没了,然后文件数量那个显示字段正确的变成了0
难道是ExtJS每拖动一下,就重新刷新了该控件?
被迫先尝试下把上传控件窗口设置成了不可拖动,虽然不出现消失的问题了,可总还是不对劲
在网上搜索了N天,没有结果
后来到是搜索到一个类似的,是日期控件拖动后会消失,嗯有点象,里面解释是阴影导致的内存泄露,这个有点夸张了么
不过解决方法到是正确的
代码在下面,覆盖Drag方法,取消阴影
Ext.override(Ext.Window.DD, { startDrag: function() { var w = this.win; this.proxy = w.getEl(); if (w.constrain !== false) { var so = w.el.shadowOffset; this.constrainTo(w.container, { right: so, left: so, bottom: so }); } else if (w.constrainHeader !== false) { var s = this.proxy.getSize(); this.constrainTo(w.container, { right: -(s.width - this.headerOffsets[0]), bottom: -(s.height - this.headerOffsets[1]) }); } }, endDrag: function(e) { this.win.saveState(); } });
这个代码加进去后,拖动时控件里的文件不再消失了,不过拖动的时候有些难看,没办法