是否可以覆盖和混合一个类?
我尝试在构造函数中应用mixin,但是没有将属性/函数添加到覆盖中。
我认为mixins隐含地应用于引用它们的类?
Ext.define('App.mixins.VTypes', {
//extend: 'Ext.mixin.Mixin',
timeTest : /^([1-9]|1[0-9]):([0-5][0-9])(\s[a|p]m)$/i,
time: function(v, field) { return this.timeTest.test(v); },
timeText: 'Not a valid time. Must be in the format "12:34 PM".',
timeMask: /[\d\s:amp]/i
});
Ext.define('App.overrides.VTypes', {
override : 'Ext.form.field.VTypes',
mixins : {
vtypes : 'App.mixins.VTypes'
},
IPAddressTest : /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
IPAddress: function(v) { return this.IPAddressTest.test(v); },
IPAddressText: 'Must be a numeric IP address, for eg: 111.1.1.1',
IPAddressMask: /[\d\.]/i,
constructor : function() {
Ext.apply(this, this.mixins.vtypes);
this.callParent(arguments);
}
});
这是我正在处理的Sencha Fiddle。
答案 0 :(得分:1)
您无法轻松地将mixin应用于Ext.form.field.VTypes
。实际上,您的构造函数永远不会被调用(请查看Ext.form.field.VTypes
的源代码)。此外,Ext.form.field.VTypes
被定义为单身。
Ext.form.field.VTypes
的定义与例如类定义非常不同。一个GridPanel。它表现得更像纯粹的JS"类"定义,因此你的mixin永远不会像正常情况那样被应用#34; ExtJS类。
尽管如此,您可以通过自己的方式轻松模拟mixin行为:
var ip = {
IPAddressTest : /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,
IPAddress: function(v) { return this.IPAddressTest.test(v); },
IPAddressText: 'Must be a numeric IP address, for eg: 111.1.1.1',
IPAddressMask: /[\d\.]/i
};
var time = {
timeTest : /^([1-9]|1[0-9]):([0-5][0-9])(\s[a|p]m)$/i,
time: function(v, field) { return this.timeTest.test(v); },
timeText: 'Not a valid time. Must be in the format "12:34 PM".',
timeMask: /[\d\s:amp]/i
};
Ext.apply(Ext.form.field.VTypes, ip);
Ext.apply(Ext.form.field.VTypes, time);
在这里,您可以省略覆盖,只需将对象定义应用于Ext.form.field.VTypes
单例。我认为,这样做更具可读性和可理解性(但这仅仅是我的观点)。