自定义cardpanel改进NavigationView支持路由,历史记录,加入消息提示组件(废弃 仅参考)

直接分离插件化,可选择是否支持历史记录功能

  1 /*
  2 *扩展NavigationView
  3 *返回时自动销毁视图,节约内存
  4 */
  5 Ext.define('ux.CardPanel', {
  6     extend: 'Ext.NavigationView',
  7     xtype: 'cardPanel',
  8     config: {
  9         navigationBar: {
 10             /*禁止标题切换动画防止pop+push时标题位移*/
 11             animation: false
 12         }
 13     },
 14     /*初始化*/
 15     initialize: function () {
 16         this.viewStack = {};
 17         //设置初始页面
 18         var defItemId = this.getDefItemId();
 19         if (defItemId) {
 20             this.viewStack[defItemId] = true;
 21         }
 22         return this.callParent(arguments);
 23     },
 24     /*调试*/
 25     //        applyActiveItem: function (newCard, oldCard) {
 26     //            console.log(this.getItems().keys);
 27     //            return this.callParent(arguments);
 28     //        },
 29     /*返回按钮被点击时*/
 30     onBackButtonTap: function () {
 31         this.popView();
 32     },
 33     /*移除所有的视图,并且显示一个新的视图*/
 34     popAllAndPush: function (xtype, title) {
 35         var me = this,
 36         innerItems = this.getInnerItems();
 37         for (var i = innerItems.length - 1; i > -1; i--) {
 38             /*过滤掉需要显示的视图*/
 39             ord = innerItems[i];
 40             if (ord.getItemId() != xtype) {
 41                 /*控制返回按钮的显示*/
 42                 /*先hide再remove不然再次push时会出错*/
 43                 ord.hide();
 44                 me.remove(ord, true);
 45                 me.viewStack[ord.getItemId()] = false;
 46             }
 47         }
 48         //添加新视图
 49         me.pushView(xtype, title);
 50         //重置历史记录
 51         me.getNavigationBar().backButtonStack = [title];
 52     },
 53     /*添加个新的视图*/
 54     pushView: function (xtype, title) {
 55         /*过滤已经添加的视图*/
 56         if (!this.viewStack[xtype]) {
 57             var viwe = Ext.create(xtype, {
 58                 title: title,
 59                 itemId: xtype
 60             });
 61             this.push(viwe);
 62         } else if (this.getActiveItem().getItemId() != xtype) {
 63             this.setActiveItem(xtype);
 64         }
 65         this.viewStack[xtype] = true;
 66     },
 67     /*移除当前视图且显示一个新的视图*/
 68     popAndPush: function (xtype, title, isClear) {
 69         this.popView();
 70         /*是否清除纪录*/
 71         if (isClear) {
 72             this.getNavigationBar().backButtonStack.pop();
 73         }
 74         this.pushView(xtype, title);
 75     },
 76     /*移除当前视图*/
 77     popView: function () {
 78         var me = this,
 79         innerItems = this.getInnerItems(),
 80         ord = innerItems[innerItems.length - 1];
 81         if (ord) {
 82             me.viewStack[ord.getItemId()] = false;
 83             ord.hide();
 84             //强制销毁,防止销毁不完全引发错误
 85             me.remove(ord, true);
 86         }
 87     },
 88     //隐藏导航栏
 89     navHide: function () {
 90         var nav = this.getNavigationBar();
 91         !nav.isHidden() && nav.hide();
 92     },
 93     //显示导航栏
 94     navShow: function () {
 95         var nav = this.getNavigationBar();
 96         nav.isHidden() && nav.show();
 97     },
 98     //隐藏返回按钮
 99     backBtnHide: function () {
100         var btn = this.getNavigationBar().getBackButton();
101         !btn.isHidden() && btn.hide();
102     },
103     //显示需要显示的额外按钮,没有配置action属性的按钮不受控制
104     showBtn: function (show) {
105         show = show ? show : [];
106         var showItem = {};
107         for (var i = 0,
108             item; item = show[i]; i++) {
109             showItem[item] = true;
110         }
111         var nav = this.getNavigationBar();
112         if (nav) {
113             var btns = nav.query('button');
114             for (var i = 0,
115             item; item = btns[i]; i++) {
116                 if (showItem[item.action]) {
117                     item.show();
118                 } else if (item.action) {
119                     item.hide();
120                 }
121             }
122         }
123     }
124 });

消息提示功能被单独提取为公用类

  1 /*公共类*/
  2 Ext.define('myUtil', {
  3     statics: {
  4         //store公用加载方法
  5         storeLoadById: function (id) {
  6             var store = Ext.getStore(id);
  7             if (store && store.getCount() < 1) {
  8                 this.storeLoad(store);
  9             }
 10         },
 11         //store加载方法,带参数
 12         storeLoadByParams: function (store, params) {
 13             if (store) {
 14                 store.removeAll();
 15                 store.setProxy({
 16                     extraParams: params
 17                 });
 18                 this.storeLoad(store);
 19             }
 20         },
 21         //加载stroe
 22         storeLoad: function (store) {
 23             var me = this;
 24             me.showMessage('正在努力加载中...');
 25             store.loadPage(1, function () {
 26                 me.hideMessage();
 27             });
 28         },
 29         //list->info公用加载方法
 30         showInfo: function (record, view, url, params) {
 31             var me = this;
 32             me.showMessage('正在努力加载中...');
 33             Ext.data.JsonP.request({
 34                 url: url,
 35                 params: params,
 36                 success: function (result, request) {
 37                     record.set(result);
 38                     view.setData(record.data);
 39                     me.hideMessage();
 40                 }
 41             });
 42         },
 43         /*为Ext.Viewport添加一个消息提示组件*/
 44         addMessage: function () {
 45             Ext.Viewport.setMasked({
 46                 xtype: 'loadmask',
 47                 cls: 'message',
 48                 transparent: true,
 49                 indicator: false
 50             });
 51             this.hideMessage();
 52 
 53         },
 54         /*显示一个消息提示*/
 55         showMessage: function (mes, autoHide) {
 56             var message = this.getMessage();
 57             message.setMessage(mes);
 58             message.isHidden() && message.show();
 59             //是否自动关闭提示
 60             if (autoHide) {
 61                 setTimeout(function () {
 62                     !message.isHidden() && message.hide();
 63                 },
 64                 1000);
 65             }
 66         },
 67         /*隐藏消息提示*/
 68         hideMessage: function () {
 69             var message = this.getMessage();
 70             !message.isHidden() && message.hide();
 71         },
 72         //活动消息组件
 73         getMessage: function () {
 74             return Ext.Viewport.getMasked();
 75         },
 76         //重写Lsit相关
 77         overrideList: function () {
 78             //重写分页插件
 79             Ext.define("Ext.zh.plugin.ListPaging", {
 80                 override: "Ext.plugin.ListPaging",
 81                 config: {
 82                     //自动加载
 83                     autoPaging: true,
 84                     //滚动到最底部时是否自动加载下一页数据
 85                     noMoreRecordsText: '没有更多内容了',
 86                     loadMoreText: '加载更多...' //加载更多按钮显示内容
 87                 }
 88             });
 89             //重写List
 90             Ext.define("Ext.zh.List", {
 91                 override: "Ext.List",
 92                 config: {
 93                     //取消选择效果
 94                     selectedCls: '',
 95                     //禁用加载遮罩,防止跳转时页面卡顿,使用统一的遮罩效果
 96                     loadingText: false,
 97                     emptyText: '没有更多内容了'
 98                 }
 99             });
100         }
101     }
102 });

使用:

 1 /*
 2 *主视图,负责视图切换
 3 */
 4 Ext.define('app.view.Main', {
 5     extend: 'ux.CardPanel',
 6     requires: ['app.view.Home', 'Ext.picker.Picker'],
 7     xtype: 'main',
 8     config: {
 9         navigationBar: {
10             cls: 'backNavigation',
11             hidden: true,
12             items: [{
13                 hidden: true,
14                 action: 'add',
15                 xtype: 'button',
16                 align: 'left'
17             },
18             {
19                 hidden: true,
20                 action: 'select',
21                 xtype: 'button',
22                 align: 'right'
23             }]
24         },
25         //默认显示的界面itemId
26         defItemId: 'home',
27         defaultBackButtonText: '',
28         //默认项只能有一个
29         items: [{
30             itemId: 'home',
31             xtype: 'home'
32         }]
33     },
34     //执行返回
35     onBackButtonTap: function () {
36         //隐藏消息提示
37         myUtil.hideMessage();
38         //移除当前视图
39         this.popView();
40         //历史记录回退
41         history.back();
42     },
43     /*返回上一视图*/
44     Back: function () {
45         this.onBackButtonTap();
46     }
47 });

 切换代码:

 1 //显示视图xtype:这里是指alternateClassName,showBtn需要显示的按钮action集合
 2 showView: function (xtype, title, showBtn) {
 3         var main = this.getMain();
 4         main.pushView(xtype, title);
 5         main.showBtn(showBtn);
 6 },
 7 showAction: function () {
 8         this.showView('actionList', '校园活动', ['add', 'select']);
 9         this.getMain().backBtnHide();
10 }

呃,这个木有示例...

原文地址:https://www.cnblogs.com/mlzs/p/3078211.html