`

Extending Ext

阅读更多

from:

----------------------------------------------------

http://www.extjs.com/learn/Tutorial:Extending_Ext_for_Newbies_%28Chinese%29

----------------------------------------------------

 

一般你会希望使用类(class)来诠释面何对象的思想。本教程的所述几点理点亦体现了这种思想。


复用的类

有时候你打算生成一个带有若干配置项(config options)的组件(component),这些配置项你会想是让它可复的。就好像一种情况,有一部分的面板是已经固定好高、宽的,其中只有标题是不同的,我们可以把它做成预配置类(preconfigured class)。
使用构造器函数

构造器函数是完成该任务的方法之一,如下例:

// 构造器函数
var MyPanel = function(config) {
    Ext.apply(this, {
        // 在这里设定预配置的参数项
 
        width: 300,
        height: 300
    });
    MyPanel.superclass.constructor.apply(this, arguments);
};
// My Panel继承了Ext.Panel
Ext.extend(MyPanel, Ext.Panel, {});
 
var myfirstpanel = new MyPanel({
    title: 'My First Panel'
});
 
var mysecondpanel = new MyPanel({
    title: 'My Second Panel'
});


工厂模式

生成“预配置对象”的一种途径是使用工厂模式(Factong Design Pattern)。透过工厂函数返回一个全新的实例(该函数包含了预先配置好的参数项),工厂模式的方法不需要类的继承。如果纯粹为了制定固定的配置项参数来讲工厂模式是一个不错的方法,其内部原理比继承、覆盖某个类来得简单。

function createMyPanel(config) {
    return new Ext.Panel(Ext.apply({//在这里设定预配置的参数项
        width: 300,
        height: 300
    }, config));
};
 
var myfirstpanel = createMyPanel({
    title: 'My First Panel'
});
 
var mysecondpanel = createMyPanel({
    title: 'My Second Panel'
});


扩展功能

使用OO的类的其中一个原因是你打算从另外一个类的基础上扩展新的功能,假设现在有一面板类,我们在此基础上增加一个新的方法并重写(override)父类的一个方法,过程如下:

// Constructor
var MyPanel = function(config) {
    //这里复用配置项
    Ext.apply(this,
        width: 300,
        height: 300
    });
    // 调用父类的构造函数,提取父类的功能
    MyPanel.superclass.constructor.apply(this, arguments);
    // 在这里你可以为当前对象新添加功能
    // 如事件:
    this.on('click', function() {alert("You Clicked " + this.title);}, this);
};
// My Panel继承了Ext.Panel
Ext.extend(MyPanel, Ext.Panel, {
    // 在这里你可以为当前的类加入静态的变量,所有这个类生成的实例都是使用这里声明的变量
    // 如果你不确定请在构造器内设定。不要在这里放置由'new'或'xtype'操作而成的对象。在构造器内设定配置项对象会更安全。
 
    // 新添加的函数
    myNewFunction: function() {
    },
    // 重写原有函数
    onRender: function() {
        MyPanel.superclass.onRender.apply(this, arguments);
        this.myNewFunction();
    }
});
 
var myfirstpanel = new MyPanel({
    title: 'My First Panel'
});
 
var mysecondpanel = new MyPanel({
    title: 'My Second Panel'
});

另一种方法是用构造器的方式写出代码:

var MyPanel = function(config) {
    // 调用父类的构造函数,提取父类的功能
    MyPanel.superclass.constructor.call(this, Ext.apply({
        //这里复用配置项
        width: 300,
        height: 300
    }, config));
 
    // 位于构造器之后,在这里你可以为当前对象新添加功能(如处理如事件)
    this.on('click', function() {alert("你已点击" + this.title);}, this);
};


以上的方法是重写构造器的方式实现继承的,另外我们还可以重写initComponents方法写出相同的功能,但需要指出是initComponent方法是属于 Ext.Components的方法,只能在组件上使用,不是一个通用的方法。这里是一个示例:

var MyPanel = Ext.extend(Ext.Panel, {
    // 在这里你可以为当前的类加入静态的变量,所有这个类生成的实例都是使用这里声明的变量
    // 如果你不确定请在构造器内设定。不要在这里放置由'new'或'xtype'操作而成的对象。在构造器内设定配置项对象会更安全。
 
    initComponent: function() {
        //Reusable config options here
        Ext.apply(this,
            width: 300,
            height: 300
        });
       // 调用父类的构造函数,提取父类的功能
       MyPanel.superclass.initComponent.apply(this, arguments);
        // 位于构造器之后,在这里你可以为当前对象新添加功能(如处理如事件)
        this.on(
            'click',
            function() {
                alert("你已点击" + this.title);
            },
            this
        );
    },
    // 新添加的函数
    myNewFunction: function() {
    },
    // 重写原有函数
    onRender: function() {
        MyPanel.superclass.onRender.apply(this, arguments);
        this.myNewFunction();
    }
});


你首先可能会观察到的是这儿没有构造函数。Ext会为你创建构造函数。这个构造函数有点不同,叫initComponent。

这在高级教程和例子常见的使用方法。只要简单记住它做的事情与构造函数是差不多的。

推荐在调用父类的构造器或initComponent方法之后,为当前对象新添加事件。

MyPanel.superclass.constructor.apply(this, arguments);
    // 位于构造器之后,在这里你可以为当前对象新添加功能(如处理如事件)
    this.on(
        'click',
        function() {
            alert("你已点击" + this.title);
        },
        this
    );


工厂模式的案例中你可以在工厂方法以外的地方登记事件的处理函数。

myFirstPanel.on(
        'click',
        function() {
            alert("你已点击" + this.title);
        },
        myFirstPanel //作用域
    );


另外,除了添加listeners配置项还有其他处理监听器的方法,不过我推荐高级用户使用。

完成同一件事在Ext中有不同的方式。挑选一种你较倾向的方法。

分享到:
评论

相关推荐

    php extending and embedding

    书中提到了几种不同的构建扩展的方法,如使用`ext_skel`或`PECL_Gen`工具来自动生成扩展模板。这些工具可以帮助开发者快速搭建起扩展的基本框架,从而将更多的精力放在具体的业务逻辑上。 #### 扩展与嵌入 **扩展*...

    Ext继承和扩展写的例子。

    扩展(Extending)则更侧重于在运行时向现有类添加新的功能,而无需创建全新的类。这通常通过实现`Ext.override`方法来完成。当你希望为一个现有的类增加新的方法或覆盖原有的方法时,可以使用这种方法。例如,如果...

    Practical.Ext.JS.4.pdf

    最后,在第十章“Extending, Unit Testing, and Packaging”中,作者强调了对Ext JS 4应用进行扩展、单元测试和打包的重要性。这部分内容涵盖了如何编写可扩展的代码,进行单元测试来确保代码质量,以及如何将应用...

    Ext JS 6 By Example

    Explore, debug, and get practical by extending the sample projects, including a sample RESTful API project in Ext JS 6 Gain a quick and easy understanding through working source code and get an ...

    Practical Ext JS 4.pdf

    非常好的一本介绍ExtJS 4的书,英文版的,不过通俗易懂,强烈推荐。 Chapter 1: Core JavaScript and JavaScript Frameworks Chapter 2: Overview of Ext JS 4 ...Chapter 10: Extending, Unit Testing, and Packaging

    ExtJs之带图片的下拉列表框插件

    在ExtJs的官方网站上有一个带图片的下拉列表,其中扩展了ExtJs的Combo,名称叫做IconCombox,官方地址为: http://www.extjs.com/learn/Tutorial:Extending_Ext_Class_Chinese 但是这个IconComboBox有个缺点,就是...

    关于遗传R-extending模 (2002年)

    最后,“M是正则投射的R自ext”指出了M不仅是投射的,并且它满足正则性,即M的任意循环子模都是M的直和因子。 在具体证明中,还提到了循环基本子模的构造,这是构建模分解的关键步骤之一。循环子模是指由单个元素...

    自我扩展FormPanel 和Store

    自我扩展(self-extending)是一种设计模式,允许我们在现有的类基础上添加新的功能或改进现有行为,而无需修改原代码。在ExtJS中,我们可以通过继承FormPanel和Store类,然后重写或添加方法来实现自我扩展。例如,...

    PHP扩展开发及内核应用

    Autoconf库用于查找和链接必要的模块,扩展生成器(如ext_skel和PECL_Gen)是构建扩展的工具。嵌入式SAPI和宿主环境的设置是扩展集成到应用程序中的方法。错误处理、全局变量和超级全局变量的使用,以及通过嵌入式...

    ffs.rar_full

    描述中提到的“support for extending counters to full 64-bit ns counter”意味着这个实现支持扩展计数器,使其能够精确到64位纳米级别的时间戳,这极大地提高了时间精度,对于实时性和低延迟应用尤其关键。...

    lvextend命令 扩展逻辑卷空间

    lvextend命令的作用是在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问。 使用lvextend命令动态在线扩展磁盘空间,整个空间扩展过程对于应用程序来说是完全...Extending logical volume lvol0 to 300.00 MB L

Global site tag (gtag.js) - Google Analytics