11、手把手教你Extjs5(十一)模块界面的总体设计
上一节中设计了一些模块自定义中用到的要素,为了直观起见,这一节先建立一个模块的主界面。看过我 模块管理常规功能自定义系统的设计与实现 博客的人应该会有所了解了。一个模块的主界面是一个Grid,在其上方有个操作按钮的工具条,在左边有导航区域,在右边有一个记录明细的显示区域。下面即是一个例子:
下面我们来搭建这个界面,首先在view中建立目录module,在此目录下建立Module.js,ModuleController.js, moduleModel.js。这三个文件分别为模块的主界面,模块的控制器和模块的数据模型。然后在module下建立目录region,在这个目录下放置模块各个部分的控件,具体的控件和界面对应图如下:
下面来看看各个部分的代码:Module.js
/**
* 一个模块的主控界面的容器,用来安放各个模块控件以及协调他们之间的关系
*/
Ext.define('app.view.module.Module', {
extend: 'Ext.panel.Panel', alias: 'widget.modulepanel', requires: ['app.view.module.ModuleController', 'app.view.module.ModuleModel'], uses: ['app.view.module.region.Navigate', 'app.view.module.region.Grid',
'app.view.module.region.Detail'], controller: 'module',
// MVVM架构的控制器的名称,main控制器会自动加载,这个控制器不会自动加载,需要在requires中指定,不知道是为什么
viewModel: {
type: 'module'
},
bind: {
// glyph : '{tf_glyph}', // 这一个绑定是无效的,在tabPanel渲染过后,再修改这个值,将不会有任何效果。
title: '{tf_title}' // 这个绑定是有效的,可以根据ModuleModel中的值来设置title
},
layout: 'border', // 模块采用border布局 initComponent: function () {
this.glyph = this.getViewModel().get('tf_glyph'); // 由于上面的glyph的bind无效,因此需要在这里加入glyph的设置
this.items = [{
xtype: 'navigate', // 导航区域
region: 'west',
width: 250,
collapsible: true,
split: true
}, {
xtype: 'modulegrid', // 模块的grid显示区域
region: 'center' }, {
xtype: 'recorddetail', // 记录明细
region: 'east',
width: 250,
collapsible: true, // 可以折叠隐藏
collapseMode: 'mini', // 折叠陷藏模式
split: true
// 可以拖动大小
}] this.callParent();
} })
ModuleController.js
/**
* 模块的控制器
*/ Ext.define('app.view.module.ModuleController', {
extend: 'Ext.app.ViewController', requires: ['Ext.MessageBox', 'Ext.window.Toast'], alias: 'controller.module', init: function () {
console.log('modulecontroller.init')
} })
ModuleModel.js
/**
* 模块的控制器
*/ Ext.define('app.view.module.ModuleController', {
extend: 'Ext.app.ViewController', requires: ['Ext.MessageBox', 'Ext.window.Toast'], alias: 'controller.module', init: function () {
console.log('modulecontroller.init')
} })
下面看看四个模块控件的源码:
Grid.js
/**
* 模块数据的主显示区域,继承自Grid
*/ Ext.define('app.view.module.region.Grid', {
extend: 'Ext.grid.Panel',
alias: 'widget.modulegrid',
uses: ['app.view.module.region.GridToolbar'],
bind: {
title: '{tf_title}' // 数据绑定到ModuleModel中的tf_title
},
dockedItems: [{
xtype: 'gridtoolbar', // 按钮toolbar
dock: 'top'
}], // 自定义字段的还没有做,先放几个固定的
columns: [{
dataIndex: 'tf_name',
text: '工程项目名称',
width: 250
}, {
dataIndex: 'tf_budget',
text: '投资总额'
}],
store: new Ext.data.Store({
fields: ['tf_name', {
name: 'tf_budget',
type: 'float'
}],
data: [{
tf_name: '安居房建设工程',
tf_budget: 1230000
}, {
tf_name: '道路建设工程',
tf_budget: 453092
}]
})
})
GridToolbar.js
/**
* 一个模块的grid上面显示的toolbar,里面放置了各种操作按钮 暂时还没有考虑到权限
*/
Ext.define('app.view.module.region.GridToolbar', {
extend: 'Ext.toolbar.Toolbar',
alias: 'widget.gridtoolbar',
uses: ['app.ux.GridSearchField'],
initComponent: function () {
this.items = [{
text: '显示',
glyph: 0xf022
}, {
text: '新增',
xtype: 'splitbutton',
glyph: 0xf016,
menu: [{
text: '复制新增',
tooltip: '新增时先将当前记录添入到新记录中',
glyph: 0xf0c5
}, '-', {
text: '上传Excel表单条新增',
tooltip: '根据指定的excel表添好数据后,上传新增一条记录',
glyph: 0xf062
}, {
text: '上传Excel表批量新增',
tooltip: '根据下载的Excel表中的要求添加数据后,上传批量新增数据',
glyph: 0xf062
}]
}, {
text: '修改',
glyph: 0xf044
}, {
text: '删除',
glyph: 0xf014
}, '-', {
glyph: 0xf0c6,
xtype: 'splitbutton',
menu: [{
text: '新增附件',
icon: 'images/button/additionadd.png',
glyph: 0xf093
}, '-', {
text: '预览所有附件',
glyph: 0xf03e
}, '-', {
text: '下载所有附件',
glyph: 0xf019
}]
}, {
xtype: 'splitbutton',
glyph: 0xf0ce,
menu: [{
text: '列表导出至excel',
glyph: 0xf0ce
}, '-', {
text: '选中记录导出至excel',
glyph: 0xf0ce
}]
}, {
xtype: 'splitbutton',
glyph: 0xf02f,
menu: [{
text: '打印当前页',
glyph: 0xf02f
}, {
text: '打印所有记录',
glyph: 0xf02f
}]
}, '-', '筛选', {
width: 60,
xtype: 'gridsearchfield',
store: Ext.create('Ext.data.Store', {
proxy: {
type: 'rest'
}
})
}];
this.callParent();
}
})
Navigate.js
/**
* 导航区域的主控界面,这是这个系统的核心控件之一
*/ Ext.define('app.view.module.region.Navigate', {
extend: 'Ext.panel.Panel',
alias: 'widget.navigate', // glyph : 0xf0d0,
title: '导航', initComponent: function () { this.callParent();
} })
Detail.js
/**
* 选中了grid中的一条记录,显示明细的区域,放在右边
*/ Ext.define('app.view.module.region.Detail', {
extend: 'Ext.grid.property.Grid',
alias: 'widget.recorddetail', //glyph : 0xf0ca, //加了这一条,那个在最顶右侧可以隐藏此panel的按钮就不见,extjs真是bug一袋子,bug一屋子
title: '记录明细', initComponent: function () {
this.source = {
'工程项目名称': 'title',
'投资总额': 2929292
}
this.callParent();
} })
11、手把手教你Extjs5(十一)模块界面的总体设计的更多相关文章
- 4、手把手教你Extjs5(四)主界面上加入顶部和底部区域
这一节为主界面加一个顶部区域和底部区域.一个管理系统的界面可以粗分为顶部标题部分.中间数据展示和处理的部分.底部备注和状态部分. 在增加这二个区域之前,我们先在MainModel.js中加入一些数据. ...
- 手把手教Linux驱动2-之模块参数和符号导出
通过<手把手教Linux驱动1-模块化编程,玩转module>的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数. 一.给模块传递参数 当我们加载一个模块到Li ...
- 21、手把手教你Extjs5(二十一)模块Form的自定义的设计
前面几节完成了模块Grid的自定义,模块Form自定义的过程和Grid的过程类似,但是要更复杂一些.先来设计一下要完成的总体目标. 1、可以有多个Form方案,对应于显示.新增.修改.审核.审批等功能 ...
- 13、手把手教你Extjs5(十三)模块字段和Grid列的定义[1]
这一节加入模块自定义字段,并根据这些字段生成model.然后再定义grid中的分组和列.从这一切开始真正进入到了模块自定义的节奏当中,代码的复杂度和技巧性也大大提高.先从模块字段的自定义开始.先看一下 ...
- 23、手把手教你Extjs5(二十三)模块Form的自定义的设计[2]
在本节中将要加入各种类型的字段,在加入字段的时候由于可以一行加入多个字段,因此层次结构又多了一层fieldcontainer.form里面的主要层次结构如下: form -- fieldSet -- ...
- 20、手把手教你Extjs5(二十)模块Grid的多列表方案
对于有很多字段的模块在一个grid中显示所有的字段,会显得很臃肿,对于不同的用户其侧重的字段类型也不尽相同,因此就有必要为Grid的列表设计多个方案.在这个自定义系统进行设计的时候,我已经将这部分内容 ...
- 19、手把手教你Extjs5(十九)模块Grid的其他功能的设想
经过对自定义模块和Grid的设计和编码,现在已经能对一个有配置信息的模块来生成界面并进行一些简单的CURD操作.由于这是一个全解释性的前台的架构,因此你想到的任何新主意都可以放到所有的模块中. 比如对 ...
- 18、手把手教你Extjs5(十八)模块记录的拖放删除、拖放复制新增
网页当中的拖放(drag-drop)是比较有趣的操作,extjs5中很好的封装了拖放的动作,也有各种类来支持,但是要学好“拖放”这个东西真是很难,特别是象我这样英语不好的人,看不太懂官网上的说明,做一 ...
- 17、手把手教你Extjs5(十七)模块的新增、修改、删除操作
上节在Grid展示时做了一个金额单位可以手工选择的功能,如果你要加入其他功能,也只要按照这个模式来操作就行了,比如说你想改变金额字段的颜色.小数位数.零值是否显示.货币符号.单位显示在标题栏或者跟在金 ...
随机推荐
- C#,js数据排序及其操作
List<int> listint=new List<int>{2,1,7,3,8,5,4,6};listint.Sort((x, y) => x - y); var a ...
- Android开发 R cannot be resolved to a variable问题的分析
R文件是系统自动生成的,如果没出现的话,你的XML文件是不是有错误?是否之前修改过res文件夹下面.xml文件 R文件没有生成的情况有几种: 1.项目没有自动编译:这种时候只需要简单的编译一下工程就会 ...
- FZU Problem 1895 整除45问题(整除问题+字符串维护+优化)
这个题有点烧脑啊,但是只要想清楚被45整除的数,肯定能被5和9整除,能被9整除的数各位加起来肯定是9的倍数,能被5整除的末尾是0或5. 然后dfs的过程稍微不太好懂,还有几个优化必须要注意.dfs的过 ...
- 学习笔记——原型模式Prototype
原型模式,简单说就是具有一个克隆方法,外部可以直接使用此方法得到相应对象的拷贝对象. 比如哆啦A梦的复制镜,一照,就把物品拷贝了一份(虽然是镜子复制是相反的,这里就忽略这个细节了) C++中依靠拷贝构 ...
- 配置Notepad++直接运行Python、Perl、C、C++、Java
运行(F5),输入命令并保存 cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT cmd ...
- location对象的属性和方法应用(解析URL)
本文将与大家分享下location对象使用属性和方法来解析URL的实例,感兴趣的朋友可以参考下,希望对你有所帮助 location对象提供了很多属性和方法用来解析URL. 复制代码代码如下: &l ...
- listview设置条目点击的时候不变色(让状态选择器不起作用)
未设置前的效果如下图: 很明显,“酷狗音乐”那个条目被点击的时候,条目背景变为蓝色,怎么去掉这个颜色呢? java代码可以这么写: listView.setSelector(new ColorDraw ...
- Nginx将通过IP访问重定向
server { listen 80 default_server; server_name localhost; location / { rewrite ^ http://www.xxx.com/ ...
- jvisualvm
f the fonts used by VisualVM are hard to read, switching the LaF might help. Try for example 'visu ...
- RTC-高效率实现TimerTicker编解码
源:RTC-高效率实现TimerTicker编解码 嵌入式系统中时间是很重要的,在以往的系统中设计者常常使用一种叫RTC的专用芯片来维持时间,这种芯片种类很多接口形式也很多,如常用的DS1302.PC ...