Ext利用TreeStore构建动态菜单

 项目中很多时候要动态创建菜单,但是ExtJs自身并没有提供这个组件。下面是我利用TreeStore实现的动态菜单的完整代码

/**
 * Ext Js library 4.2.1
 * 
 * 动态菜单栏
 * @class Xzr.view.base.main.DynamicMenu
 * @extends Ext.toolbar.Toolbar
 * @author 王成委
 * 
 * 2014-01-23 17:20:31
 * 
 */

Ext.define('Xzr.view.base.main.DynamicMenu',{
	extend:'Ext.toolbar.Toolbar',
	
	mixins: {  
        bindable: 'Ext.util.Bindable'  
	},
	
	alias:'widget.dynamicmenu',
	
	displayField:'moduleName',
	typeField:'moduleType',
	applicationField:'application',
	controllerField:'controller',
	leafField:'leaf',
	
	height:36,
	
	border:false,
	
	defaults:{
		style:{
			marginRight:'10px;'
		}
	},
	
	store:'sys.DynamicMenuStore',
	
	style:{
		paddingLeft:'10px;',
		paddingRight:'10px;'
	},
	
	cls:'x-fy-menubar',
	
	
	initComponent:function(){
		var me = this;
		
		if(Ext.isString(me.store))
			me.store = Ext.data.StoreManager.lookup(me.store || 'ext-empty-store');
			
		me.bindStore(me.store);
		
		this.callParent();
	},
	
	getStoreListeners:function(){
		var me = this;
		return {
			expand: me.onExpand
		}
	},
	
	/**
	 * 响应节点展开事件
	 * @private
	 * @param {Ext.data.Model} parent
	 * @param {Ext.data.Model[]} records
	 * @param {Boolean} successful
	 */
	onExpand:function(parent,records,successful){
		var me = this,container;
		
		if(parent.isRoot()){
			me.createMenuHeader(records);
			return;
		}
		
		container = me.down('#'+parent.getId()).menu
		if(!container )return;
		
		Ext.Array.each(records,function(node){
			me.doAdd(container,node);
		});
	},
	
	/**
	 * 创建
	 * @param {Ext.data.Model[]} records
	 */
	createMenuHeader:function(records){
		var me = this;
		
		Ext.Array.each(records,function(node,index){
			var split = (index+1)<records.length;
			me.addParentNode(me,node,split);
		});
		
		me.add('->');
		me.add({xtype:'button',text:'转到',action:'scroll',iconCls: 'x-icon-list',style: 'margin-left: 8px;',style:'marginRight:5px;',menu:[]});
	},
	
	doAdd:function(container,node){
		var me = this;
		if(node.isLeaf())me.addLeafNode(container,node);
		else me.addParentNode(container,node);
	},
	//添加父节点
	addParentNode:function(container,node,split){
		var me = this,
			menuItem = {
			text:node.get(me.displayField),
			itemId:node.getId(),
			menu:[]
		};
		//将菜单添加到父容器中
		container.add(menuItem);
		if(split)container.add('-');
		//展开节点
		node.expand();
	},
	//添加子节点
	addLeafNode:function(container,node){
		var me = this,
		menuItem = {
			text:node.get(me.displayField),
			itemId:node.getId(),
			type:node.get(me.typeField),
			app:node.get(me.applicationField),
			controller:node.get(me.controllerField)
		};
		
		container.add(menuItem);
	}
});
其原理就是向toolbar中绑定Store,并监听Store的expand事件,在expand事件中完成将节点添加到容器中的操作。

有关Store绑定的详细资料请到我的这篇博文中查看: http://blog.csdn.net/jaune161/article/details/18266301



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大扑棱蛾子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值