Ext JS 4 新特性2:配置项属性(config)之二

时间:2021-03-20 09:07:07

Ext JS 4 新特征2:配置项属性config之二

☞ Config(自动的setters和getters)

         Ext JS 4介绍了config声明方式,在Ext JS 中也有几个例子;在运行程序的时候,使用setter和getter方法就可以传递一些configuration参数,还可以改变这些参数。当在config声明中定义某某配置项属性的时候,Ext JS 4将会自动地生成与属性紧密相关的4个方法:getter,setter,reset和apply。

      让我们在MyApp.MyWindow这个类中看一下如何声明config的,代码如下:

 1 Ext.define('MyApp.MyWindow', {
2 extend : 'Ext.Window',
3 width :300,
4 height :200,
5
6 config : {
7 title : '欢迎光临本窗口'
8 },
9
10 //基于学习,写了一个的applyTitle,
11 applyTitle : function(newtitle) {
12 this.width=50;
13 console.log("调用了applyTitle!");
14 return newtitle;
15 }
16 });

在代码中,设置这个窗口类的缺省标题是:'欢迎光临本窗口'         

        

         到现在需要我们注意的是,在config中只定义了一个title属性,那么Ext框架随之将会为title自动产生了以下的4个方法:

         •       getTitle: 获取title属性.                               

         •       setTitle: 设置新的值到title属性.

         •       resetTitle: 把title属性恢复到默认值.

         •       applyTitle: 当你每一次调用setTitle的时候,这个方法同时将被调用。可以用它来做一些自定义处理的东西。

 

程序继续进行…,当我们建立了'MyApp.MyWindow'类的一个实际窗口后,我们就可以调用这4个方法中的任何一个了:

                                    

    var win = Ext.create('MyApp.MyWindow');

        win.show();

                   Ext JS 4 新特性2:配置项属性(config)之二

        我很遗憾的看到上图这样的结果,  到现在也不知道是什么原因,猜测是默认的窗口类就是这个德行吧!

 

程序继续修改…,当我在win窗口显示之前调用了setTitle后,看到了一些正常,继续添加了setTitle()方法后的代码,运行的结果如下所示:

        …

       var win = Ext.create('MyApp.MyWindow');

       win.setTitle('我改变了默认的窗口标题'); 

        win.show();

         …

                                Ext JS 4 新特性2:配置项属性(config)之二

按照以前的经验,在调用setTitle的时候,applyTitle应该会在之前被触发的同时调用,但在这里我没有发现这个结果,不知道是什么原因?这就是在下面这段后记的主要内容。

    后记:如果我把title略加改变,如atitle;把applyTitle()改为对应的applyAtitle(),这样就完全可以了,而且,效果很好。后来我才注意到,是书本举得这个例子误导了我。在经过多次的测试后,我猜测title这个属性项早被窗口类拥有了,事实确实证明是这样的。本类MyApp.MyWindow是继承了Ext.Window窗口类,如果我把config中的title去掉后,也就是在我们没有任何自定义的config属性项的情况下,仍然去调用win.setTitle(),发现我们还可以改变窗口的标题,这说明title是窗口类的一个早就存在的名称了,这与我想使用config来定义一个新title有冲突,所以说书本上用窗口类后再用一个早已存在的title作为你自己要定义的新属性项是不合适的,因为在后来的代码调用的是原来早就存在setTitle(),和因它而触发的原来早就有的ApplyTitle(),而你自己写的applyTtitle()不能够覆盖系统存在的那个的。所以书本上的这个例子是不恰当的,只是让我更进一部了解点东西。<end-20130718>