我的模型有两个数据字段:持久和计算:
Ext.define('My.model.Value', { extend: 'Ext.data.Model', idProperty: 'id', fields: [ { name: 'id', type: 'auto' }, { name: 'percentage', type: 'float' }, // values in 0..1 range { name: 'percentageDecimal', type: 'float', persist: false, calculate: function(v) { v = v.percentage; return Ext.isNumber(v) ? v * 100.0 : v; } } ] });
percentageDecimal
字段用于网格中,并且可以编辑。
问题:每次percentage
更新时,如何将模型更改为自动更新percentageDecimal
字段?
我使用ExtJs 5.0.1。
答案 0 :(得分:2)
我使用@adaskos的建议如下:
Ext.define('My.model.Value', { extend: 'Ext.data.Model', idProperty: 'id', fields: [ { name: 'id', type: 'auto' }, { name: 'percentage', type: 'float' }, // values in 0..1 range { name: 'percentageDecimal', type: 'float', persist: false, calculate: function(v) { v = v.percentage; return Ext.isNumber(v) ? v * 100.0 : v; } } ], set: function (fieldName, value, options) { if (Ext.isString(fieldName)) { // single field update if (fieldName === 'percentageDecimal') { this.set('percentage', Ext.isNumber(value) ? 0.01 * value : value); return; } } else { // multiple fields update if (Ext.isDefined(fieldName.percentageDecimal)) { var data = Ext.clone(fieldName); data.percentage = Ext.isNumber(data.percentageDecimal) ? 0.01 * data.percentageDecimal : data.percentageDecimal; delete data.percentageDecimal; this.set(data); return; } } this.callParent(arguments); } });
答案 1 :(得分:1)
我不知道他们是否在5.0.1中添加了自动执行此操作的方法,但您始终可以覆盖set方法,每当percentageDecimal
发生更新时,都会重新计算{{1 }}
我更喜欢的另一种选择:如果您希望获得足够的更新,但您想要的只是在网格中显示,您可以从模型中删除额外的计算字段,并使用percentage
设置列并更改其{{ 1}}函数显示它(如十进制)。
如下所示:
dataIndex: 'percentageDecimal'
答案 2 :(得分:1)
您应该使用配置选项depends
自动更新!
并使用函数convert
而不是calculate
(不确定它是否适用于计算,我需要测试)
请参阅http://docs.sencha.com/extjs/5.1/5.1.0-apidocs/#!/api/Ext.data.field.Field-cfg-depends