都覆盖和混合一个类

时间:2017-05-17 14:52:01

标签: javascript extjs override mixins

是否可以覆盖和混合一个类?

我尝试在构造函数中应用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

1 个答案:

答案 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单例。我认为,这样做更具可读性和可理解性(但这仅仅是我的观点)。