extjs-mvc构造实践(三):完美基础页面2

extjs-mvc构造实践(三):完美基础页面2

平常典范的背景治理体系,都是左边菜单右边tabs构造规划。不免俗,咱也这么完成!

定义左边导航菜单

新建:app/luter/view/main/Navlist.js



/**
 * 采纳extjs6的list tree组件构建一个导航菜单
 */
Ext.define('luter.view.main.Navlist', {
    extend: 'Ext.list.Tree',
    alias: 'widget.navlist',
    width: 240,
    minWidth: 120,
    frame: true,
    border: true,
    split: true,
    expanderFirst: false,
    expanderOnly: false,
    highlightPath: true,
    itemId: 'navigationTreeList',
    ui: 'navigation',
    store: 'NavTreeStore',
    initComponent: function () {
        this.callParent(arguments);
    }
});


为了显现icon图标,引入font awsome字体图标,在app.html引入:


  <!--引入fontawsome-->
    <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

定义导航菜单数据Store:app/luter/store/NavTreeStore.js

Ext.define('luter.store.NavTreeStore', {
    extend: 'Ext.data.TreeStore',
    fields: ['id', 'text', 'leaf', 'module', 'tips', 'icon'],
    autoLoad: true,
    proxy: {
        type: 'ajax',
        url: 'app/testdata/menu.json',
        reader: {
            type: 'json',
            root: 'children',
            successProperty: 'success'
        },

        actionMethods: {
            read: 'GET'
        },
        listeners: {
            exception: function (proxy, response, operation, eOpts) {
                DealAjaxResponse(response);
            }
        }
    },
    root: {
        text: '功用菜单',
        id: 0,
        leaf: false,
        expanded: false
    },

    listeners: {
        beforeload: function (store, operation, eOpts) {
            if (store.isLoading()) return false;
        },

        nodeappend: function (me, node, index, eOpts) {
            //睁开节点。
            if (!node.isRoot() && !node.get('leaf')) {
                node.set('expanded', true);
            }

        }
    }
});
/**
 * 解决问题:重要是因为RootTreeItem引发
 * ext-all.js?v=20000000:22 Uncaught TypeError: b.getFloated is not a function
 */

Ext.define('Overrides.list.RootTreeItem', {
    override: 'Ext.list.RootTreeItem',
    config: {
        floated: null
    },
    setFloated: function (floated) {
        var me = this,
            el = me.element,
            placeholder = me.placeholder,
            node, wasExpanded;
        if (me.treeItemFloated !== floated) {
            if (floated) {
                placeholder = el.clone(false, true);
                placeholder.id += '-placeholder';
                me.placeholder = Ext.get(placeholder);
                me.wasExpanded = me.getExpanded();
                me.setExpanded(true);
                el.addCls(me.floatedCls);
                el.dom.parentNode.insertBefore(placeholder, el.dom);
                me.floater = me.createFloater();
            }
            else if (placeholder) {
                wasExpanded = me.wasExpanded;
                node = me.getNode();
                me.setExpanded(wasExpanded);
                if (!wasExpanded && node.isExpanded()) {
                    me.preventAnimation = true;
                    node.collapse();
                    me.preventAnimation = false;
                }
                me.floater.remove(me, false);
                el.removeCls(me.floatedCls);
                placeholder.dom.parentNode.insertBefore(el.dom, placeholder.dom);
                placeholder.destroy();
                me.floater.destroy();
                me.placeholder = me.floater = null;
            }
            me.treeItemFloated = floated;
        }
    },
    getFloated: function () {
        return this.treeItemFloated;
    },
    runAnimation: function (animation) {
        return this.itemContainer.addAnimation(animation);
    },
    stopAnimation: function (animation) {
        animation.jumpToEnd();
    },
    privates: {
        createFloater: function () {
            var me = this,
                owner = me.getOwner(),
                ownerTree = me.up('treelist'),
                floater,
                toolElement = me.getToolElement();
            me.floater = floater = new Ext.container.Container({
                cls: ownerTree.self.prototype.element.cls + ' ' + ownerTree.uiPrefix + ownerTree.getUi() + ' ' + Ext.baseCSSPrefix + 'treelist-floater',
                floating: true,
                width: Ext.isIE8 ? 200 : (ownerTree.expandedWidth - toolElement.getWidth()),
                shadow: false,
                renderTo: Ext.getBody(),
                listeners: {
                    element: 'el',
                    click: function (e) {
                        return owner.onClick(e);
                    }
                }
            });
            floater.add(me);
            floater.show();
            floater.el.alignTo(toolElement, 'tr?');
            return floater;
        }
    }
});

写点模仿菜单数据:app/testdata/menu.json



[
  {
    "id": "111",
    "text": "体系治理",
    "href": null,
    "leaf": false,
    "iconCls": "fa fa-home",
    "module_id": "no sign",
    "qtip": "这个处所显现鼠标悬停提醒",
    "children": [
      {
        "id": "11111",
        "text": "用户治理",
        "href": null,
        "leaf": true,
        "iconCls": "fa fa-user",
        "module_id": "sys.UserModule",
        "qtip": "体系用户治理",
        "children": []
      },
    ]
  },
  {
    "id": "111",
    "text": "体系治理",
    "href": null,
    "leaf": false,
    "iconCls": "fa fa-home",
    "module_id": "no sign",
    "qtip": "这个处所显现鼠标悬停提醒",
    "children": [
      {
        "id": "11111",
        "text": "用户治理",
        "href": null,
        "leaf": true,
        "iconCls": "fa fa-user",
        "module_id": "sys.UserModule",
        "qtip": "体系用户治理",
        "children": []
      },
    ]
  }
  
]

定义中心视图展现部份tabpanel:app/luter/view/main/ContentPanel.js


/*
 *体系主页面TabPanel面板
 */
 Ext.define('luter.view.main.ContentPanel', {
    extend: 'Ext.tab.Panel',
    alias: 'widget.syscontentpanel',
    border: false,
    plugins: [Ext.create('luter.ux.TabCloseMenu', {//用到了一个tab右键封闭插件
        closeTabText: '封闭当前页',
        closeOthersTabsText: '封闭其他页',
        closeAllTabsText: '封闭一切页',
        closeIcon: +' fa fa-remove red-color',
        closeOtherIcon: ' fa fa-remove red-color',
        closeAllIcon: 'fa fa-remove red-color',
    })],
    items: [{
        xtype: 'panel',
        id: 'dashboardpanel',
        title: 'DASHBOARD',
        baseCls: 'home-body',
        closeable: false,
        glyph: 42
    }]

});

在viewport中引入导航树和内容地区,编辑:app/luter/view/main/Viewport.js,内容以下:

/**
 * 主视图占满全屏是个viewport
 */
Ext.define('luter.view.main.ViewPort', {
    extend: 'Ext.Viewport',
    alias: 'widget.viewport',//别号,与xtype对应
    layout: 'border',//东南西北中规划,边境嘛
    stores: [],
    //动态加载相干组件定义的js,相当于java的:import com.xxx.*;
    requires: ['luter.view.main.Header', 'luter.view.main.Footer', 'luter.view.main.Navlist', 'luter.view.main.ContentPanel'],
    initComponent: function () {
        var me = this;
        Ext.apply(me, {
            items: [{
                region: 'north',
                xtype: 'appheader'
            }, {
                region: 'west',
                xtype: 'navlist'//引入导航菜单
            }, {
                region: 'center',
                xtype: 'syscontentpanel'//引入内容tabpanel

            }, {
                region: 'south',
                xtype: 'sysfooter'
            }]
        });
        me.callParent(arguments);
    }
});

末了,别忘记在主控制器里到场导航菜单的Store,

修正主控制器:app/luter/controller/MainController.js


Ext.define('luter.controller.MainController', {
    extend: 'Ext.app.Controller',
    views: ['main.ViewPort'],
    stores: ['NavTreeStore'],//引入导航树的Store
    init: function (application) {
        var me = this;
        this.control({
            'viewport': {//监听viewport的初始化事宜,能够做点其他事变在这里,若有必要,记得viewport定义里的alias么?
                'beforerender': function () {
                    console.log('viewport begin render at:' + new Date());
                },
                'afterrender': function () {
                    console.log('viewport  render finished at:' + new Date());
                },
            }
        });
    }

});

如今,全部项目构造应当如图:
《extjs-mvc构造实践(三):完美基础页面2》

翻开app.html,界面应当如图:

《extjs-mvc构造实践(三):完美基础页面2》

下一篇,完成左边菜单点击与内容地区tabpanel联动功用,而且完成控制器的动态加载。

    原文作者:差点笨死
    原文地址: https://segmentfault.com/a/1190000012941254
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞