注意:我没有测试这段代码,如果您有问题,请使用这些概念并稍后评论。
当您为数据实体定义Ext.data.Model类时(对于Ext JS 3,请使用Ext.data.Record),请将转换函数作为Ext.data.Field属性实例的一部分添加。如果您想要为所有字段执行此操作,但可能不建议这样做。
我对这个框架还很陌生,所以我不知道如何在转换函数中使用“this.self”符号,以防您在Model类中扩展另一个类。例如,如果您在Employee类中没有定义默认值,并且它继承自另一个类(例如Employee),但Employee构造函数设置了该属性,则在编码数据时,它将采用在超类(基类或父类)构造函数中定义的值。现在,它只获取EmployeeDeveloper.dataValue属性。
Ext.define('EmployeeDeveloper', {
extend: 'Ext.data.Model',
fields: [
{ name: 'name', type: 'string', defaultValue: 'Paul' },
{ name: 'profession', type: 'string', defaultValue: 'Ext JS developer' },
{ name: 'salary', type: 'float', defaultValue: '95000' },
{ name: 'dataValue', type: 'string',
convert: function(value, record) {
return encodeData(record.get('dataValue'));
}
}
]
});
var empDev = Ext.create(
'EmployeeDeveloper',
{
name: 'MacGyver',
dataValue: 'ABC'
},
'MacGyver',
123
);
var encodedDataValue = empDev.get('dataValue');
关于convert的注意事项: 如果您引用的字段在convert函数签名下方定义,代码将不知道它并且无法检索该值。
或者如果您有一个自定义类但不使用模型类...
今晚我也读到了一些关于Ext JS中很有趣的东西。他们在Ext JS 4中添加了自动getter和setter。框架的新版本会自动在您定义的类的“config”属性内部以“get”、“set”、“reset”或“apply”为前缀,并将属性的第一个字母大写。
在常规JavaScript中,他们没有真正的类,但是Sencha已经使定义类(使用“define”函数)和实例化用户定义类的对象实例成为可能。
例如,假设您定义了以下类:
Ext.define('Paul.MyClass'), {
extend: 'Ext.Window',
config: {
name: 'Paul'
}
});
如果您像这样创建对象实例,您将自动获得四个函数的访问权限。
var win = Ext.create('Paul.MyClass');
var myName = win.getName();
win.setName('MacGyver');
win.resetName();
win.applyName();
win.show();
我建议使用你提出的逻辑来覆盖apply*方法。然后在获取新值之前调用win.get*();。最好为每个要编码的字段添加一个额外的编码字段,这样每次在代理和/或存储中访问(获取或设置)数据时就不必操作属性了。
Ext.define('Paul.MyClass'), {
extend: 'Ext.Window',
config: {
name: 'Paul',
dataValue: 'non encoded value of your data'
}
applyName: function(title) {
this.name = this.name + ' ' + title;
}
applyDataValue: function(encodeKey) {
this.self.dataValue = 'encoded data value';
}
});
convert()
是一个双向方法。例如,我使用它来在十进制颜色代码和十六进制之间进行转换。 - sha