我想截取模型上的字段获取/设置,以便我可以在值显示之前以及它们存储在模型中之前对其进行转换。在这种情况下,我想将 uriencoded 数据存储在模型中,但显示解码值。
当我直接覆盖 get/set 方法时,我看到代理正在使用它们将原始数据放入模型中。我不想覆盖该过程,我什至不确定如何判断它是加载模型还是加载 ui 的代理。
最好的方法是什么?顺便说一句,转换似乎是一个糟糕的选择。它不是 2-way 和活的。
我想截取模型上的字段获取/设置,以便我可以在值显示之前以及它们存储在模型中之前对其进行转换。在这种情况下,我想将 uriencoded 数据存储在模型中,但显示解码值。
当我直接覆盖 get/set 方法时,我看到代理正在使用它们将原始数据放入模型中。我不想覆盖该过程,我什至不确定如何判断它是加载模型还是加载 ui 的代理。
最好的方法是什么?顺便说一句,转换似乎是一个糟糕的选择。它不是 2-way 和活的。
注意:我没有测试过这段代码,所以如果你有问题,请稍后使用这些概念和评论。
当您为数据实体定义 Ext.data.Model 类时(对 Ext JS 3 使用 Ext.data.Record),添加一个转换函数作为 Ext.data.Field 属性实例的一部分。如果您愿意,可以对所有字段执行此操作,但可能不推荐。
我是这个框架的新手,所以我不知道该怎么做的一件事是在转换函数中使用“this.self”表示法,以防您在模型类中扩展另一个类。例如,如果您没有在 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) {
// feel free to use value and record parameters in this function
return encodeData(record.get('dataValue')); // you may have to use the "value" parameter instead of record.get('dataValue') if referencing the field in it's own convert function (haven't tested)
}
}
]
});
var empDev = Ext.create(
'EmployeeDeveloper',
{
name: 'MacGyver',
dataValue: 'ABC'
},
'MacGyver',
123
);
var encodedDataValue = empDev.get('dataValue');
关于转换的注意事项:如果您引用的是在转换函数签名下方定义的字段,代码将不知道它并且无法检索该值。
或者,如果您有自定义类但不使用模型类...
今晚我还读到了一些在 Ext JS 中很简洁的东西。他们在 Ext JS 4 中添加了自动 getter 和 setter。新版本的框架会自动为您的属性添加“get”、“set”、“reset”或“apply”前缀,并将“”中属性的第一个字母大写config" 定义的类的属性。
在常规 JavaScript 中,它们没有真正的类,但 Sencha 使定义类(使用“define”函数)和实例化用户定义类的对象实例成为可能。
例如,假设您定义了以下类:
Ext.define('Paul.MyClass'), {
extend: 'Ext.Window',
config: {
name: 'Paul'
}
});
如果您像这样创建对象的实例,您将自动访问四个函数。
var win = Ext.create('Paul.MyClass'); // create instance of MyClass object
var myName = win.getName(); // get name
win.setName('MacGyver'); // set name
win.resetName(); // this resets the value back to the default value ('Paul')
win.applyName(); // this calls custom code
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; // custom logic goes here
}
applyDataValue: function(encodeKey) {
// get the encoded data value
this.self.dataValue = 'encoded data value'; // custom logic goes here
}
});