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


        这一节来完毕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;








跟我一起学extjs5(17--Grid金额字段单位MVVM方式的选择)的更多相关文章

  1. 16、手把手教你Extjs5(十六)Grid金额字段单位MVVM方式的选择

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

  2. 跟我一起学extjs5(42--单个模块的数据新增方式)

    跟我一起学extjs5(42--单个模块的数据新增方式)         前面的章节中已经增加了一个自己定义的模块,而且能够进行数据的新增.改动.删除的操作了,在这个基础上就能够大作文章了. 这一节来 ...

  3. 跟我一起学extjs5(16--各种Grid列的自己定义渲染)

    跟我一起学extjs5(16--各种Grid列的自己定义渲染)         Grid各列已经可以展示出来了.列的类型包含字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自己定义了各种类型 ...

  4. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  5. 跟我一起学extjs5(22--模块Form的自己定义的设计)

    跟我一起学extjs5(22--模块Form的自己定义的设计)         前面几节完毕了模块Grid的自己定义,模块Form自己定义的过程和Grid的过程类似,可是要更复杂一些.先来设计一下要完 ...

  6. 跟我一起学extjs5(24--模块Form的自己定义的设计[2])

    跟我一起学extjs5(24--模块Form的自己定义的设计[2])         在本节中将要增加各种类型的字段,在增加字段的时候因为能够一行增加多个字段,因此层次结构又多了一层fieldcont ...

  7. 跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)

    跟我一起学extjs5(19--模块记录的拖放删除.拖放复制新增)         网页其中的拖放(drag-drop)是比較有趣的操作,extjs5中非常好的封装了拖放的动作,也有各种类来支持,可是 ...

  8. 跟我一起学extjs5(11--自己定义模块的设计)

    跟我一起学extjs5(11--自己定义模块的设计)        从这一节開始我们来设计并完毕一个自己定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息. 下面信息仅仅是我自己在开发过程中 ...

  9. 跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

    跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])         写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的 ...

随机推荐

  1. [A Top-Down Approach][第二章 应用层]

    [A Top-Down Approach][第二章 应用层] 标签(空格分隔): 未分类 网络应用是计算机网络存在的理由 首先从定义几个关键的应用层概念开始 应用程序所需要的网络服务,客户和服务器,进 ...

  2. Android -------- 用XmlPullParser解析器解析XML文件

  3. 【socket.io研究】3.手机网页间聊天核心问题

    前面我们已经说了服务器相关的一些内容,且又根据官网给出的一个例子写了一个可以聊天的小程序,但是这还远远不够呀,这只能算是应用前的准备工作.接下来,一起来考虑完善一个小的聊天程序吧. 首先,修改服务器的 ...

  4. Unable to find manifest signing certificate in the certificate(Visual studio)

    今天打开之前做的项目,突然得到很奇怪的编译错误: Unable to find manifest signing certificate in the certificate 网上搜一下,有两个方法, ...

  5. iOS 使用GitHub托管代码(github desktop使用)

    iOS 使用GitHub托管代码 代码托管 1.首先得有一个GitHub的账号,没有的话就去https://github.com注册一个吧. 2.下载GitHub Mac客户端:http://mac. ...

  6. css控制图片变灰色,彩色

    <A href="链接地址"><IMG src="p1.jpg" border="0"></A> < ...

  7. 你好,C++(20).4.2.2 表达并列条件选择的switch语句:如果……如果……如果……

    4.2.2  表达并列条件选择的switch语句:如果……如果……如果…… 在现实世界中,还有这样一类特殊的条件选择: 如果明天是晴天,我就穿T恤: 如果明天是阴天,我就穿衬衣: 如果明天是雨天,我就 ...

  8. Spring MVC异常处理

    Spring Mvc 中异常处理,一般有两种解决办法: 一.利用org.springframework.web.servlet.handler.SimpleMappingExceptionResolv ...

  9. 关于nginx架构探究(1)

    nginx的架构主要是有一个主监控进程:master;三个工作进程:worker:还有Cache的两个进程.back-end-server是后端服务器,主要是处理后台逻辑.nginx作为代理服务器需要 ...

  10. Android Studio builde.gradle 配置说明

    //声明是Android应用程序 apply plugin: 'com.android.application' android { //编译SDK版本 compileSdkVersion 21 bu ...