跟我一起学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. [AngularJS] Angular 1.5 $transclude with named slot

    In Angular 1.5, there is no link and compile. So use if you transclude, you cannot access the fifth ...

  2. JAVA--好友界面面板

    package GongYou; //package windows.best_demo; import java.awt.*; import javax.swing.*; import java.u ...

  3. SQL2008安装重启失败

    我今天安装SQL2008的一些问题经历SQL2008安装重启失败大致出错信息如下:RebootRequiredCheck 检查是否需要挂起计算机重新启动.挂起重新启动会导致安装程序失败. 失败 需要重 ...

  4. 在Java中兼容Windows和Linux的路径处理

    Linux中的路径使用'/',而Windows下正好相反'\',Java提供了以系统属性的方式获取路径分隔符: System.getProperty("file.separator" ...

  5. AsyncTask api

    package com.bf.systemadmin;import android.os.AsyncTask;import android.util.Log;public class MyTask e ...

  6. 【转】C++中的位拷贝与值拷贝

    [转]http://blog.csdn.net/liam1122/article/details/1966617 为了便于说明我们以String类为例: 首先定义String类,而并不实现其成员函数. ...

  7. Dalvik指令集

    类型 语法 含义 V void,只用于返回值类型 Z boolean B byte S short C char I int J long F float D double L Java类类型 [ 数 ...

  8. nyoj组合数

    算法:深搜 描述 找出从自然数1.2.... .n(0<n<10)中任取r(0<r<=n)个数的所有组合. 输入输入n.r.输出按特定顺序输出所有组合. 特定顺序:每一个组合中 ...

  9. POJ 1064 Cable master(二分查找+精度)(神坑题)

    POJ 1064 Cable master 一开始把 int C(double x) 里面写成了  int C(int x) ,莫名奇妙竟然过了样例,交了以后直接就wa. 后来发现又把二分查找的判断条 ...

  10. pyqt5按钮计数

    万事开头难,弄了好久才做了一个简单的小程序,点击按钮就显示数字,点一下,自增1. 首先用qt设计师设计一个窗体.标签名为label,按钮名为btn,然后存储为a.ui 在shell中用命令pyuic5 ...