当前位置:编程学习 > JS >>

Extjs4快速上手四——实现菜单

本次将主要讲Extjs树形菜单的实现。在很多系统里边,树形菜单被广泛应用,主要因为其有清晰的层次结构。记得最早见到的树形菜单是通过<ul><li>实现的,非常简单。之后用C#的现成控件拖拽了一个,当时还沾沾自喜。再后来在学习师兄的一个通用后台代码时,看到了梅花雪,当时感觉太强大了,每个节点都可以存在数据库,并且能够进行自定义。之后接触到一些UI库之后,更是见到了更强大的树形菜单。

  或许实现一个简单的树形菜单对于不少人并非难事,但是想要实现一个功能比较完善的确要花不少功夫。好在目前有很多现成的供我们使用,而Extjs也提供了功能丰富的树形菜单。本次我们就来讲最简单的一种:Ext.tree.Panel。

  正如之前讲到的,我们在实现一个Extjs组件时,应该按照如下的步骤:

 

  以下就是各部分的代码实现:

//modelExt.define('et.model.Menu', {
    extend: 'Ext.data.Model',
    fields:  ['mid', 'text','cls','columns','url','expanded','optype']
});//或许你看到这些字段和下边json数据并不对应,这个并不重要,这里边有几个是我自己拓展的,只是没用到,只要几个关键的字段设置即可,下边会有介绍。
//storeExt.define('et.store.Menus',{
    extend: 'Ext.data.TreeStore',
    requires: 'et.model.Menu',
     model: 'et.model.Menu',
     autoLoad: true,            //设置自动加载,在打开页面的时候数据就自动加载
     proxy: {
        type: 'ajax',
        url: 'data/manager.json',
        reader: {
            type: 'json',
            successProperty: 'success'
        }
    }
});
//viewExt.define('et.view.Menu',{
    extend: 'Ext.tree.Panel',
    alias: 'widget.sxptmenu',
    requires:['et.store.Menus'],
    initComponent : function(){
        Ext.apply(this,{
            id: 'menu-panel',
            title: '系统菜单',
            iconCls:'icon-menu',
            margins : '0 0 -1 1',
            region:'west',
            border : false,
            enableDD : false,
            split: true,
            width : 212,
            minSize : 130,
            maxSize : 300,
            rootVisible: false,
            containerScroll : true,
            collapsible : true,
            autoScroll: false,
            store:Ext.create('et.store.Menus')
        });
        this.callParent(arguments);
    }
});
//controllerExt.define('et.controller.Menu',{
    extend: 'Ext.app.Controller',
    stores: ['Menus'], 
    models: ['Menu'], 
    views: ['Menu'], 
    init: function () { 
    //初始化部分,下面是部分是给菜单绑定单击事件,接下来会用,这里先注释 
        this.control({ 
            'sxptmenu': { 
              itemmousedown: this.loadMenu
          }
          });
    },
    loadMenu:function(selModel, record){     //加载菜单项对应panel,首先判断是不是叶子结点,是的话判断当前该panel是否已经创建,已创建的话直接激活,未创建的话创建并加入content-panel
        if (record.get('leaf')) {
            if(record.get('optype')=='window'){
                var win= Ext.getCmp(record.get('url'));
                if(!win){
                    win=Ext.widget(record.get('url'))
                }
                win.show();
            }
            else{
                var panel = Ext.getCmp(record.get('id'));
                if(!panel){ 
                    panel ={
                        id:record.get('url'),
                        title: record.get('text'),
                        xtype:record.get('url'),
                        closable: true 
                    };
                    this.openTab(panel,record.get('url'));
                }else{
                    var main = Ext.getCmp("content-panel");
                    main.setActiveTab(panel); 
      

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,