extjs4 开发中应该避免的10个问题

1.避免大量的或没必要的组件结构的嵌套

这样会导致extjs运行的性能问题

例.1A
items:[{
    xtype :'panel',
    title: 'My Cool Grid',
    layout: 'fit',
    items :[{
        xtype :'grid',
        store :'MyStore',
        columns :[{...}]
    }]
}]

例 1A. 缺点:  'panel' 是没必要的。

 

例.1B    
layout: ‘fit’,
  items:[{
    xtype :'grid',
    title: 'My Cool Grid',
    store :'MyStore',
    columns :[{...}]
}]

 例 1B. 优点: grid 本身就是一个panle ,所以直接在grid配置panel中的所有属性就可以了.


 

2.避免没有清除没有使用的组件导致的内存泄漏

许多开发者奇怪于为什么他们使用app时间越长速度越慢。其中一个最大的原因是没有清楚掉未使用的组件。例如在如下例2A中,每次用户在grip面板上右击,就会有一个contexmenu被创建。假设app一直开着且用户右击了很多次,这时候app会因为很多contentmenu没有被销毁而发生内存泄漏。

例2A 
Ext.define('MyApp.view.MyGrid',{
    extend :'Ext.grid.Panel',
    columns :[{...}],
    store: 'MyStore',
    initComponent :function(){
        this.callParent(arguments);
        this.on({
                    scope :this,
                   itemcontextmenu :this.onItemContextMenu
            });
        }, 
    onItemContextMenu :function(view,rec,item,index,event){
       event.stopEvent();
       Ext.create('Ext.menu.Menu',{
            items :[{ 
               text :'Do Something'
            }]
        }).showAt(event.getXY());
    }
});

例 2A. 缺点: 右键点击的菜单只创建不销毁。

例2B
 Ext.define('MyApp.view.MyGrid',{
    extend :'Ext.grid.Panel',
    store :'MyStore',
    columns :[{...}],
    initComponent :function(){
    this.menu=Ext.create('Ext.menu.Menu',{
            items :[{
                text :'Do Something'}
            ]}
            );
    this.callParent(arguments);
    this.on({ 
            scope :this,   
            itemcontextmenu :this.onItemContextMenu
        });
},    
     onItemContextMenu :function(view,rec,item,index,event){
        event.stopEvent();
        this.menu.showAt(event.getXY());
}
});

 

例 2B. 优点: contentmenu只被创建一次

例2C 
Ext.define('MyApp.view.MyGrid',{    
    extend :'Ext.grid.Panel',    
    store :'MyStore',    
    columns :[{...}],    
    initComponent :function(){
        this.menu=Ext.create('Ext.menu.Menu',{
            items :[{
                text :'Do Something'
            }]
        });
        this.callParent(arguments);
        this.on({
            scope :this,
            itemcontextmenu :this.onItemContextMenu
    });
},     
    onDestroy :function(){
        this.menu.destroy();
        this.callParent(arguments);
    },
    onItemContextMenu :function(view,rec,item,index,event){
        event.stopEvent();
        this.menu.showAt(event.getXY());
    }
});

  

例2C. 优点: 当grid销毁了, contextmenu也销毁了.


 3.避免巨大的控制器文件(monster controllers 这个求个优雅的翻译)

  我们常常看见一个应用程序中的一个controller有上千行代码。其实我们更倾向与把控制器文件按照功能分成多个controller文件。例如一个订单处理的app可能会有为商品列表,发货流程,用户查询等各自建立一个controller文件。这样做使代码更容易维护了。

  一些开发者喜欢根据view来分控制器文件。例如,如果有一个app有一个grid和一个form,这时就相应的会有一个控制器是管理grid的 一个控制器是管理form的。不管是是按功能还是view来分控制器,逻辑一致就可以了。只要记住控制器之间是可以进行通信的

例如下面这个例子 一个控制器中可以调用另一个控制器的方法。

this.getController('SomeOtherController').runSomeFunction(myParm);

当然你也有第二个选择 在一个控制器中触发一个事件 。另一个控制器去监听这个事件
//触发一个事件
MyApp.getApplication().fireEvent('myevent');

//在另外一个控制器中监听该事件
MyApp.getApplication().on({myevent : doSomething});
总之一句话 controller不要都写在一个文件中。

4 避免使用不好的代码目录结构
虽然这不是性能上的问题,但影响代码的可维护性。如例4A.所有view文件都放在一个文件夹中,对比例4B 根据功能把不同把view放在不同的文件夹,两者对比,不言而喻。
例4A


例4B


5 避免使用全局变量
 不要在自己的app中使用全局变量是众所周知的,但还是能看到很多开发者老是犯这个错。

6 避免id的使用
尽量不要使用id,原因很简单,app一但增大,id的使用很容出现冲突。建议使用itemId

7 避免不可靠的组件引用的使用
下面这样的写法不可靠 因为只要你这种引用很容易因为组件的添加和删除或者嵌套的原因,导致程序出错,应该尽量避免下面的写法
var
mySaveButton = myToolbar.items.getAt(2);
var myWindow = myToolbar.ownerCt;
应该类似下面的做法进行组件的引用
var mySaveButton = myToolbar.down('#savebutton');// searching against itemId
var myWindow = myToolbar.up('window');

8 大小写的问题
这里不做讨论,自己看下E文 我在文末给出原文,这是一个程序员必须有的一个习惯,很重要 

9 避免限制一个组件的属性不可配置
下面这个面板布局,属性永远是 'region:center',该面板在重用时无法改变属性 'region'值为'west'
 Ext.define('MyApp.view.MyGrid',{
    extend :'Ext.grid.Panel',
    initComponent :function(){
        Ext.apply(this,{
            store : 'MyStore',
            region :'center',
            ......
        });
        this.callParent(arguments);
    }
});
  

为了重用 应该按下面的例子的写法
Ext.define('MyApp.view.MyGrid',{
    extend :'Ext.grid.Panel',
    initComponent :function(){
        Ext.apply(this,{
            store : 'MyStore',
            ......
        });
}});
  

// 在组件创建的时候就指定 属性region 
Ext.create('MyApp.view.MyGrid',{
    region :'center'
});
从上面的对比中,可以看出在定义一个组件的时候,配置属性最好配置在组件initComponet方法之外,这样这些属性只是默认属性 ,在创建的时候你还可以修改,否则你的配置都无效


10 避免使你的代码复杂难懂
// 假设下面是一份表单的配置
items :[{
    fieldLabel : 'User',
    itemId : ‘username’
},{ 
   fieldLabel : 'Email',
   itemId : 'email' },{
  fieldLabel : 'Home Address', itemId : 'address' }]; // 你的数据是分开一个一个设置表单数据 myForm.down(‘#username’).setValue(record.get(‘UserName’)); myForm.down(‘#email’).setValue(record.get(‘Email’)); myForm.down(‘#address’).setValue(record.get(‘Address’));

而对比下面的代码

 items :[{
    fieldLabel : ‘User’,
    name: ‘UserName’
    },{
    fieldLabel : ‘Email’,
    name: ‘Email’
    },{
    fieldLabel : ‘Home Address’,
    name: ‘Address’
    }];
 myForm.loadRecord(record);

  明显 代码简洁明了

主要提醒的尽量对extjs的api熟悉,否则很容易写出晦涩难懂的代码

 

以上是我对原文的翻译,我并不是一句一句的翻译,文章后面都是我根据理解进行书写,如果和原文表达的原译有出入,还望不吝指正

原文链接http://www.sencha.com/blog/top-10-ext-js-development-practices-to-avoid/
 
posted @ 2013-08-25 01:23  21實際源代碼  阅读(941)  评论(2)    收藏  举报