这一节来完成Grid中的金额字段的金额单位的转换。转换旰使用MVVM特性,总体上和控制菜单的几种模式类似。首先在目录app/view/main/menu下建立文件Monetary.js,用于放金额单位的数据和生成菜单的items。

/**
* 金额单位的管理类
*/ Ext.define('app.view.main.menu.Monetary', {
statics: {
values: null,
getAllMonetary: function () {
if (!this.values) {
// 初始化各种金额单位 元 千元 万元 百万元 亿元
this.values = new Ext.util.MixedCollection();
this.values.add('unit', this.createAMonetary('', 1, '元'));
this.values.add('thousand', this.createAMonetary('千', 1000, '千元'));
this.values.add('tenthousand', this.createAMonetary('万', 10000,
'万元'));
this.values.add('million', this.createAMonetary('M', 100 * 10000,
'百万元'));
this.values.add('hundredmillion', this.createAMonetary('亿', 10000
* 10000, '亿元'));
}
return this.values;
}, // 生成菜单中的 items
getMonetaryMenu: function () {
var items = [];
this.getAllMonetary().eachKey(function (key, item) {
items.push({
text: item.unitText,
value: key
})
})
return items;
}, createAMonetary: function (monetaryText, monetaryUnit, unitText) {
return {
monetaryText: monetaryText, // 跟在数值后面的金额单位文字,如 100.00万
monetaryUnit: monetaryUnit, // 显示的数值需要除的分子
unitText: unitText // 跟在字段后面的单位如 合同金额(万元)
}
}, getMonetary: function (key) {
return this.getAllMonetary().get(key);
}
} })

在SettingMenu.js中加入菜单项

{
text : '金额单位',
menu : [{
xtype : 'segmentedbutton',
reference : 'monetary', // 加入了这一句,在改变数据的时候可以触发bind绑定的事件
defaultUI : 'default',
value : 'tenthousand',
items : app.view.main.menu.Monetary.getMonetaryMenu()
}]
}

生成的菜单如下:

在MainModels.js中的data属性下加入

monetary : { // 金额单位
value : 'tenthousand' // 默认万元,以后可以从后台取得个人偏好设置,或者存放在cookies中
},

在MainController.js中加入金额变更事件绑定和执行函数。

init : function() {

    var vm = this.getView().getViewModel();
// 绑定金额单位修改过后需要去执行的程序
vm.bind('{monetary.value}', function(value) {
this.onMonetaryChange(value);
}, this)
}, // 金额单位修改过后执行
onMonetaryChange : function(value) {
console.log('金额单位变更:' + value);
var m = app.view.main.menu.Monetary.getMonetary(value);
Ext.monetaryText = m.monetaryText; // 设置当前的全局的金额单位
Ext.monetaryUnit = m.monetaryUnit;
Ext.each(this.getView().query('modulegrid'), function(grid) {
if (grid.rendered) {
grid.getView().refresh();
Ext.Array.forEach(grid.columnManager.getColumns(), function(column) {
// 如果可以改变大小,并且是金额字段,则在改变了金额单位以后,自动调整一下列宽
if (!column.resizeDisabled && column.fieldDefine
&& column.fieldDefine.tf_isCurrency) {
column.autoSize();
}
})
}
});
}

绑定的时候也可以使用这种方法:

vm.bind('{monetary.value}', 'onMonetaryChange', this);

经过以上几个步骤,在上节的基础上就可以更改金额单位,并实时的刷新所有已经打开的Grid中的金额字段,刷新了以后还会对金额字段重新调整列宽。

上面展示了转换过金额单位后金额字段的值的展示。事件的流转过程如下图:

对于Grid的column自动适应宽度,经过半天的研究,搞明白了一点,就是Renderer中,返回的应该是不加标签的值,具体的样式放在metaData中来定义。比如金额的Renderer函数修改为:(原来的函数看上一节)

// 金额字段
monetaryRenderer : function(val, metaData, model, row, col, store, gridview) {
if (val) {
if (Ext.monetaryUnit && Ext.monetaryUnit != 1)
val = val / Ext.monetaryUnit;
// 正数用蓝色显示,负数用红色显示,必须css和返回的值分开来设置,否则不能autoSize()
metaData.style = 'color:' + (val > 0 ? 'blue' : 'red') + ';float:right;';
return Ext.util.Format.number(val, '0,000.00') + Ext.monetaryText;
} else
return ''; // 如果为0,则不显示
}

原来把style的属性是放在返回的值里面的,这样在自动适应宽度的时候,extjs算不出到底有多宽,这样分开设置后,自动适应宽度就正常了。然后是在column的定义里面也要修改一下,不能用formatter,而要用renderer。例如对于整型的数据要改成这样:

case 'Integer' :
Ext.apply(field, {
align : 'center',
xtype : 'numbercolumn',
format : '#',
renderer : Ext.util.Format.intRenderer,
// formatter : 'intRenderer',
editor : {
xtype : 'numberfield'
}
});
break;

16、手把手教你Extjs5(十六)Grid金额字段单位MVVM方式的选择的更多相关文章

  1. 跟我一起学extjs5(17--Grid金额字段单位MVVM方式的选择)

    跟我一起学extjs5(17--Grid金额字段单位MVVM方式的选择)         这一节来完毕Grid中的金额字段的金额单位的转换.转换旰使用MVVM特性,整体上和控制菜单的几种模式类似.首先 ...

  2. 13、手把手教你Extjs5(十三)模块字段和Grid列的定义[1]

    这一节加入模块自定义字段,并根据这些字段生成model.然后再定义grid中的分组和列.从这一切开始真正进入到了模块自定义的节奏当中,代码的复杂度和技巧性也大大提高.先从模块字段的自定义开始.先看一下 ...

  3. 6、手把手教你Extjs5(六)继承自定义一个控件

    Extjs的开发都可以遵循OOP的原则,其对类的封装也很完善了.自定义一个控件最简单的办法就是继承一个已有的控件.根据上一节的需要,我做了一个Button的子类.首先根据目录结构,在app目录下建立一 ...

  4. 手把手教你mysql(十)索引

    手把手教你mysql(十)索引 一:索引的引入 索引定义:索引是由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度. 类似于图书的目录,方便快速定位,寻找指定的内容,如一本1000页的 ...

  5. 15、手把手教你Extjs5(十五)各种Grid列的自定义渲染

    Grid各列已经能够展示出来了.列的类型包括字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自定义了各种类型的渲染样式: 1.整型:标题栏居中,数值靠右显示,正数颜色为蓝色,负数颜色为红色, ...

  6. 17、手把手教你Extjs5(十七)模块的新增、修改、删除操作

    上节在Grid展示时做了一个金额单位可以手工选择的功能,如果你要加入其他功能,也只要按照这个模式来操作就行了,比如说你想改变金额字段的颜色.小数位数.零值是否显示.货币符号.单位显示在标题栏或者跟在金 ...

  7. 20、手把手教你Extjs5(二十)模块Grid的多列表方案

    对于有很多字段的模块在一个grid中显示所有的字段,会显得很臃肿,对于不同的用户其侧重的字段类型也不尽相同,因此就有必要为Grid的列表设计多个方案.在这个自定义系统进行设计的时候,我已经将这部分内容 ...

  8. 19、手把手教你Extjs5(十九)模块Grid的其他功能的设想

    经过对自定义模块和Grid的设计和编码,现在已经能对一个有配置信息的模块来生成界面并进行一些简单的CURD操作.由于这是一个全解释性的前台的架构,因此你想到的任何新主意都可以放到所有的模块中. 比如对 ...

  9. 14、手把手教你Extjs5(十四)模块字段和Grid列的定义[2]

    model和columns生成好了,下面要修改一下Module.js和Grid.js中的代码,使其能够协同工作. /** * 一个模块的主控界面的容器,用来安放各个模块控件以及协调他们之间的关系 */ ...

随机推荐

  1. UIActivityIndicatorView的详细使用(加载菊花)

    UIActivityIndicatorView实例提供轻型视图,这些视图显示一个标准的旋转进度轮.当使用这些视图时,最重要的一个关键词是小.20×20像素是大多数指示器样式获得最清楚显示效果的大小.只 ...

  2. java的两种异常runtimeException和checkedException

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.   try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...

  3. 视频 -> 帧 浅析

    原创:转载请注明出处 关于帧率 首先以下几个概念必须弄清楚 1.一个帧就是一个画面 2.视频有无数个帧组成 3.表达时间的量  CMTime 的定义: typedef struct { CMTimeV ...

  4. map.entry<k,v>小用法(转)

    你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息.标准的Map访问方法如下: Set keys = map.keySet( ...

  5. ViewHolder最简洁的写法

    通用viewHolder工具类: public class ViewHolder { // I added a generic return type to reduce the casting no ...

  6. hdu_5555_Immortality of Frog(状压DP)

    题目连接:hdu_5555_Immortality of Frog 题意: 给你一个NxN的网格,第N行的每一列都有个青蛙,这些青蛙只会往上走,上帝会在每个膜中放一个长生不老的药,一共有N个膜,每个膜 ...

  7. Java socket通信

    首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程  等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...

  8. SQL Server2008数据库中删除用户,提示数据库主体在该数据库中拥有 架构,无法删除

    一个数据库,运行在SQL Server 2008下,数据库用户无法删除,在删除时提示“数据库主体在该数据库中拥有架构,无法删除”.原因很简单,就是由于此用户在数据库中拥有某些架构的所有权,将相关架构的 ...

  9. 关于数据结构的10个面试题(c语言实现)

    关于数据结构的10个面试题(c语言实现) 2010-04-21 22:17 5702人阅读 评论(0) 收藏 举报 数据结构面试c语言bttree 1.         输入一个链表的头结点,从尾到头 ...

  10. [转]HTTPS连接的前几毫秒发生了什么

    本文由 伯乐在线 - 水果泡腾片 翻译.未经许可,禁止转载!英文出处:JEFF MOSER.欢迎加入翻译小组. 提示:英文原文写于2009年,当时的Firefox和最新版的Firefox,界面也有很大 ...