《ExtJS源码分析与开发实例宝典》 学习笔记之第二章难点
难点:
一、左边导航菜单
1、accordion布局,可应用到任何容器类中,任何时刻只有单一组件处在激活状态
2、通过Function类的call方法来改变panel类的作用域为当前类的作用域,同时把配置项也传递给panel类,继承Ext.Panel类中的构建函数功能
Morik.Office.LeftMenu=function(config){
LeftMenu.superclass.construtor.call(this,config||{});
实现本类的功能
}
附书中源码:
Ext.ns("Morik","Morik.Office","Morik.Util","Morik.Office.Department");
Morik.Office.LeftMenu=function(config){
vard=Ext.apply({//defaultset
width:200,
split:true,
region:'west',
collapseMode:'mini',
defaults:{
border:false
},
layoutConfig:{
animate:true
}
},config||{});
config=Ext.apply(d,{
layout:'accordion',
collapsible:true
});
Morik.Office.LeftMenu.superclass.constructor.call(this,config);
//增加配置项trees
for(vari=0;i<this.trees.length;i++)
this.add({title:this.trees[i].getRootNode().text,items:[this.trees[i]]});
//事件处理
this.addEvents('nodeClick');//注册事件名
this.initTreeEvent();//运行事件监听函数
}
Ext.extend(Morik.Office.LeftMenu,Ext.Panel,{
initTreeEvent:function(){
if(!this.items)return;
for(vari=0;i<this.items.length;i++){
varp=this.items.itemAt(i);//每个子组件
if(p)
vart=p.items.itemAt(0);//每棵树
if(t)
t.on({//通过树组件的click事件来构建该LeftMenu组件的nodeClick事件
'click':function(node,event){//叶子节点,取消其默认事件处理
if(node&&node.isLeaf()){
event.stopEvent();//执行nodeClick事件注册的回调函数
this.fireEvent('nodeClick',node.attributes);
}
},
scope:this
});
}
}
})
实现该组件后便可调用它
子面板组件包含树组件,树组件一般通过Ext.tree.TreePanel类来实现
附书中源码:
vart1=newExt.tree.TreePanel({
border:false,
rootVisible:false,
root:newExt.tree.AsyncTreeNode({
text:"我的办公桌",
expanded:true,
children:[{
id:"docRec",
text:"接收公文",
leaf:true
},{
id:"docSend",
text:"发送公文",
leaf:true
},{
id:"docManage",
text:"公文管理",
leaf:true
}]
})
});
vart2=newExt.tree.TreePanel({
border:false,
rootVisible:false,//根节点不可视,只是隐藏根节点本身,子节点不会隐藏
root:newExt.tree.AsyncTreeNode({
text:"主数据管理",//该内容在树组件中不可视
expanded:true,//起初展开根状态
children:[{
id:"department",
text:"部门管理",
leaf:true
},{
id:"company",
text:"公司管理",
leaf:true
},{
id:"permissions",
text:"权限管理",
children:[{
id:"permission",
text:"权限管理",
leaf:true
},{
id:"permissionType",
text:"权限类别",
leaf:true
}]
}]
})
});
varleftmenu=newMorik.Office.LeftMenu({
title:'我的办公系统',
trees:[t1,t2]
});
对于Ext.tree.AsyncTreeNode类的数据,必须指定leaf和children配置中的一个,leaf用来指定该节点是否为叶子节点,如果不是,则需通过children配置项指定。
二、右边工作区域
Ext.TabPanel类:单击新节点时不覆盖上一节点的内容
附书中源码:
Ext.ns("Morik","Morik.Office","Morik.Util","Morik.Office.Department");
Morik.Office.MainingPanel=Ext.extend(Ext.TabPanel,{
initComponent:function(){
//一些初始化工作
Morik.Office.MainingPanel.superclass.initComponent.call(this);
this._cache={};
},
loadTab:function(node){
varn=this.getComponent(node.id);
if(n){
this.setActiveTab(n);//激活
}else{//将node的属性组成一个参数对象
varc={
'id':node.id,
'title':node.text,
closable:true
};
//找到对应类
varpn=this.findPanel(node.id);
//构建该类的实例对象
n=this.add(pn?newpn(c):Ext.apply(c,{
html:'你还没有实现该页面!'
}))
//显示并进行补救
n.show().doLayout();
}
if(n.ds)
n.ds.load({params:{start:0,limit:10}});
},
findPanel:function(name){
varret=this._cache[name];//从手动建立的关系的集合查找
if(!ret){//采用指定的ns命名空间来构建,如果命名空间没有指定,采用默认命名空间
varpn=(this.ns?this.ns:'Morik.Office')+"."
+Ext.util.Format.capitalize(name)+'Panel';
varret=eval(pn);//通过字符串类名找到该类
}
returnret;
},
//注册节点id和显示内容的实现类的对应关系,然后根据传入的id,在该注册集合中找到对应的类
addPanel:function(name,panel){
if(!this._cache)
this._cache={};//手动注册的集合
this._cache[name]=panel;
}
});