Ext的examples中有组件与组件之间的数据拖拽,可就是没找到组件自身中的数据拖拽,找到一个自身拖拽的还是个TreePanel,想着实现方式应该是一样的,可以移植到DataView上去,看了后才发现是风马牛不相及。
Tag Archives: extjs api
Ext DataView自身拖拽
2009.07.14 , ExtJS , 2 Comments , 2,379 浏览Ext desktop无法完全模式化
2009.06.17 , ExtJS , 4 Comments , 1,673 浏览在桌面应用系统中,有时需要对当前打开的窗体模式化,即用户只能进行当前的操作,禁止使用其它功能。Ext中Ext.Window的modal控制属性可以很快捷很有效的达到这一效果,但是在我做的Ext desktop中则出现了无法完全模式化的问题。
当设置Ext.Window的modal为true时,仅仅只会屏蔽掉当前桌面,而任务栏还是可以操作(如下图所示)。

想去百度或者Google一下我都不知道这个该怎么去写关键字了,自力更生吧,自己动手丰衣足食。当然也只能去查看Ext2.2.1的API文档了,逐一查看了Ext.Window的属性介绍,最终将注意力集中到了manager控制属性上,文档说明如下:
manager : Ext.WindowGroup
A reference to the WindowGroup that should manage this window (defaults to Ext.WindowMgr).
每一个Ext.Window对象的manager默认就是Ext.WindowMgr,接着再看Ext.WindowMgr的介绍,找到zseed属性:
zseed : Number
The starting z-index for windows (defaults to 9000)
我们知道z-index是用于检索或设置对象的层叠顺序的。回过头来再看看modal的描述:
modal : Boolean
True to make the window modal and mask everything behind it when displayed, false to display it without restricting access to other UI elements (defaults to false).
也就是说显示出来的window只会屏蔽掉所有z-index值小于它自身z-index值的元素。于是乎翻开desktop的css文件,看到任务栏的定义是这样的:
#ux-taskbar { background:transparent none; height:30px; margin:0; padding:0; position:relative; z-index:12001; }
zseed的默认值才是9000,而这里任务栏的z-index竟然是12001!修改方法不言而喻。
ExtJS desktop
2009.05.21 , ExtJS , 11 Comments , 3,439 浏览接下来我可能要开发Windows了,而且还得用Ext来开发,呵呵O(∩_∩)O~来几张老外做的DEMO截图预览一下吧。

ExtJS GridPanel动态列
2009.05.21 , ExtJS , 6 Comments , 10,154 浏览要实现动态更改GridPanel的列就必须先了解固定列是怎么弄出来的。GridPanel的列可以通过new Ext.grid.ColumnModel(columns)来创建,而这里的columns是一个JavaScript数组。由此可知,如果能够动态的更改这里的columns岂不OK了?
最近在写ExtJS时遇到的一些问题
2009.05.18 , ExtJS , 5 Comments , 1,917 浏览之前要我解决的那个东西,上个星期我已经搞定并交付了。开发期间遇到了一些问题,总结并记录一下备忘。
Ext DataView分页+过滤+查询+拖拽
2009.05.11 , ExtJS , 16 Comments , 4,382 浏览Seven说让先把另外两个问题放放,让我先完成如图所示的一个sample。
目前上图这个sample是我花了两天时间做出来的,目前还没有达到他的要求。
ExtJS将GridPanel放入TabPanel中
2009.02.23 , ExtJS , 4 Comments , 6,372 浏览完整的GridPanel也有了,我现在需要将它组装到后台管理中去。现在要求点击一下左边Tree中的“人员信息”节点,右边的TabPanel就显示出与之对应的GridPanel。最简单的方法就是在TabPanel的html属性(应该可以这么叫吧)中使用iframe来打开另一个用于显示GridPanel的页面,相关代码如下:
var c1=new Ext.tree.TreeNode({ id:'c1', text:'人员信息', listeners:{ 'click':function(node, event) { event.stopEvent(); var n = tab.getComponent(node.id); if (!n) { //判断是否已经打开该面板 n = tab.add({ 'id':node.id, 'title':node.text, closable:true, //通过html载入目标页 html:'<iframe scrolling="auto" frameborder="0" width="100%" height="100%" src="UserListGridPanel.jsp"></iframe>' }); } tab.setActiveTab(n); } } });
这种做法虽然很简单,但是又带来两个问题:
1.页面会刷新
2.UserListGridPanel.jsp页面中也必须加载庞大的ExtJS库
当然也有办法解决了,可以使用autoLoad来解决。修改上面的代码:
var c1=new Ext.tree.TreeNode({ id:'c1', text:'人员信息', listeners:{ 'click':function(node, event) { event.stopEvent(); var n = tab.getComponent(node.id); if (!n) { //判断是否已经打开该面板 n = tab.add({ 'id':node.id, 'title':node.text, closable:true, //自动载入UserListGridPanel.jsp页面,该页面含有JavaScript,不缓存 autoLoad:{url:'UserListGridPanel.jsp',scripts:true,nocache:true} }); } tab.setActiveTab(n); } } });
用了之后我又头大了,正常的话应该是如图下图所示。

可现在得到的却是下面这种结果。

想来想去,改来改去,最后我猜想应该是渲染的时候出问题了,上面两种方式中UserListGridPanel的renderTo属性一直都是Ext.getBody(),可是显示结果却不一样,也就是说两种情况下的Ext.getBody()不是同一个对象(OOP习惯了,什么都是对象O(∩_∩)O哈哈~)。第一种方式中Ext.getBody()指的就UserListGridPanel.jsp,而第二种方式中Ext.getBody()指的则是main.jsp。
于是试着在UserListGridPanel.jsp中创建一个id为“UserListGridPanel”的div,然后修改rederTo属性为Ext.get('UserListGridPanel'),看来猜的没错,这样改确实可以。可是页面又变成下面这样了:

我快抓狂了...
再次把JS翻来覆去的改了N遍,得到的结果还是那样...
可是单独运行UserListGridPanel.jsp却是正常的啊!突然想到了点什么,上面不是说用autoLoad时,被载入的页面中可以不用再载入ExtJS库吗?而我现在的UserListGridPanel.jsp中还载入了ExtJS库,会不会和main.jsp中的发生冲突了?
结果当然不言而喻了。
Ext GridPanel数据分页 服务器数据交互
2009.02.21 , ExtJS , No Comments , 3,142 浏览昨天的GridPanel虽说较为完整了,不过却缺少了数据分页功能。今天又对其再次改进,使其可以进行数据分页。改动不是很大,只是对UserListGridPanel的数据源进行了修改并增加了分页条。

UserListGridPanel = Ext.extend(Ext.grid.GridPanel,{ //初始化数据添加组件和数据修改组件 insertWin:new InsertUserInfoWindow(), updateWin:new UpdateUserInfoWindow(), constructor:function(){ //数据源 this['store'] = new Ext.data.Store({ url:UserListGridPanel.ACT_URL, reader:new Ext.data.JsonReader({ root:'rows', totalProperty:'count' }, Ext.data.Record.create([ 'UId','UName','UTrueName','UPassword' ])) }), UserListGridPanel.superclass.constructor.call(this,{ //将该列表渲染到网页的body中 renderTo:Ext.getBody(), autoHeight:true, bbar:new Ext.PagingToolbar({ pageSize:10,//每页数据大小 store:this.store }), width:300, tbar:[{ text:'添加人员', handler:function(){ this.insertWin.show(); }, scope:this },'-',{ text:'修改人员', handler:function(){ this.updateWin.show(); try{ this.updateWin.load(this.getSelected()); }catch(err){ Ext.Msg.alert('系统提示',err.description); this.updateWin.close(); } }, scope:this },'-',{ text:'删除人员', handler:function(){ Ext.Msg.confirm('警告','删除是不可逆的,是否确定删除?',function(btn){ if(btn == 'yes'){ this.remove(); } },this); }, scope:this }], //列模式 colModel:new Ext.grid.ColumnModel([{ align:'center', header:'用户名', dataIndex:'UName', menuDisabled:true },{ align:'center', header:'真实姓名', dataIndex:'UTrueName', menuDisabled:true },{ align:'center', header:'密码', dataIndex:'UPassword', menuDisabled:true }]), loadMask:{msg:'数据加载中...'}, //选择模式 selModel:new Ext.grid.RowSelectionModel({ singleSelect:true,//只可单选 listeners:{ 'rowselect':{ fn:function(sel,index,r){ this.fireEvent('rowselect',r); }, scope:this } } }) }); //数据加载事件,向服务器递交查询参数,这里每次查询10条数据 this.getStore().load({params:{start:0,limit:10}}); this.insertWin.on('submit',this.onInsertWinSubmit,this); this.updateWin.on('submit',this.onUpdateWinSubmit,this); this.addEvents('rowselect'); }, getSelected:function(){ var sm = this.getSelectionModel(); if(sm.getCount() == 0) throw Error('您尚未选中任何人员记录!'); return sm.getSelected(); }, insert:function(r){ this.getStore().add(r); }, update:function(r){ //更改本地数据 var sr = this.getSelected(); for(var i in sr.data){ sr.set(i,r.get(i)); } //提交更改 sr.commit(); }, //使用AJAX方式删除数据库及数据列表中的选中数据 remove:function(){ try{ var rc = this.getSelected(); Ext.Ajax.request({ url:'user.do?action=delUser', params:rc.data }); this.getStore().remove(rc); }catch(err){ Ext.Msg.alert('警告',err.description); } }, onInsertWinSubmit:function(win,r){ //向列表中插入新数据 this.insert(r); }, onUpdateWinSubmit:function(win,r){ //修改列表中选中的数据 this.update(r); } });