關於extjs控制項的id和樣式的研究

來源:互聯網
上載者:User

extjs中包含了大量的控制項,我們用的時候會發現這些控制項的id和樣式太難把握了,粗略看上去好像沒有什麼規律性,這也讓我們為使用控制項的應用程式寫自動化測試帶來了難題。其實,這些控制項的id和樣式是有規律的。

 

比方說:我們最簡單的面板控制項,他的樣式和id可能如下所示:

 

650) this.width=650;" alt="" src="http://www.bkjia.com/uploads/allimg/131228/114FH626-0.png" border="0" />

 

其實這個控制項id和樣式是非常有規律的,如果仔細研讀過原始碼,可以發現每個都用範本語言寫了一個模板,然後控制項的id,樣式建置規則都是在模板中定義的。

比如panel控制項的模板定義如下:

 

 
  1. '<div id="{id}-body"   
  2.       class="{baseCls}-body  
  3.       <tpl if="bodyCls"> {bodyCls}</tpl>',  
  4.       ' {baseCls}-body-{ui}  
  5.       <tpl if="uiCls">',  
  6.             '<tpl for="uiCls">   
  7.                 {parent.baseCls}-body-{parent.ui}-{.}     
  8. </tpl>',  
  9.       '</tpl>"  
  10.        <tpl if="bodyStyle"> 
  11.            style="{bodyStyle}" 
  12.        </tpl>>',  
  13. '</div>' 

 

從這裡我們看出,任何一個控制項的id總是我們賦值給他的id然後加上“-body"尾碼,這個id是怎麼來的呢?它是你在建立這個組件時候給他分配的值:比如:clusterstab,否則的話,它就會用Ext.id來自動產生一個。比如,我們的例子中,id是自己分配的:

 
  1. this.control({  
  2. 'mainPanel':{  
  3.     afterrender:function(){  
  4.       scope.thisTab='clusterstab';  
  5.       Ext.getCmp('clusterstab').add(ext.create('widget.contentPanel',{  
  6.     id: scope.thisTab+'Panel',  
  7.     showType:scope.thisTab  
  8. })); 

見第4行和6行可以解釋為什麼我們的例子中控制項id叫做clustertabPanel-body.

 

下面來談談樣式的產生:

因為控制項的複雜性,所以一個控制項的樣式也許有多個組成部分,我們逐一來看。

基本樣式:如第2行,是${baseCls}-body,這個${baseCls}是取決於控制項的類型,每個控制項都有自己的定義,比如panel的樣式的baseCls如下:

 
  1. baseCls : Ext.baseCSSPrefix + 'panel', 

而這個Ext.baseCSSPrefix在Extjs中的buildSettings中定義:

 
  1. Ext.buildSettings = Ext.apply({  
  2.        baseCSSPrefix: 'x-',  
  3.        scopeResetCSS: false 
  4.    }, Ext.buildSettings || {}); 

現在聯合起來看,我們知道我們面板的baseCls就是x-panel,所以寫在最終頁面上我們面板控制項的基本樣式就是x-panel-body

Body樣式面板上內容所用的樣式):如第3行,它意思是如果定義了bodyCls,那麼就顯示bodyCls,對於面板,bodyCls的定義如下:

 
  1. initRenderData: function() {  
  2.         return Ext.applyIf(this.callParent(), {  
  3.             bodyStyle: this.initBodyStyles(),  
  4.             bodyCls: this.initBodyCls()  
  5.         });  
  6.     }, 

從這裡看出來,樣式定義在initBodyCls()方法中:

 
  1. initBodyCls: function() {  
  2.         var me = this,  
  3.             cls = '',  
  4.             bodyCls = me.bodyCls;  
  5.  
  6.         if (bodyCls) {  
  7.             Ext.each(bodyCls, function(v) {  
  8.                 cls += " " + v;  
  9.             });  
  10.             delete me.bodyCls;  
  11.         }  
  12.         return cls.length > 0 ? cls : undefined;  
  13.     }, 

所以,它是吧所有的bodyCls的內容用單字元分隔開來。

 

ui樣式:這點類似於bodyCls,但我們例子中uiCls 沒有,因為他從父類中繼承來的uiCls為[]

style定義的樣式:見第10-11行,他們是定義在bodyStyle中的,我們找到這段代碼定義:

 
  1. initBodyStyles: function() {  
  2.         var me = this,  
  3.             bodyStyle = me.bodyStyle,  
  4.             styles = [],  
  5.             Element = Ext.Element,  
  6.             prop;  
  7.  
  8.         if (Ext.isFunction(bodyStyle)) {  
  9.             bodyStyle = bodyStyle();  
  10.         }  
  11.         if (Ext.isString(bodyStyle)) {  
  12.             styles = bodyStyle.split(';');  
  13.         } else {  
  14.             for (prop in bodyStyle) {  
  15.                 if (bodyStyle.hasOwnProperty(prop)) {  
  16.                     styles.push(prop + ':' + bodyStyle[prop]);  
  17.                 }  
  18.             }  
  19.         }  
  20.  
  21.         if (me.bodyPadding !== undefined) {  
  22.             styles.push('padding: ' + Element.unitizeBox((me.bodyPadding === true) ? 5 : me.bodyPadding));  
  23.         }  
  24.         if (me.frame && me.bodyBorder) {  
  25.             if (!Ext.isNumber(me.bodyBorder)) {  
  26.                 me.bodyBorder = 1;  
  27.             }  
  28.             styles.push('border-width: ' + Element.unitizeBox(me.bodyBorder));  
  29.         }  
  30.         delete me.bodyStyle;  
  31.         return styles.length ? styles.join(';') : undefined;  
  32.     }, 

從這裡看出,它是分離出當前的bodyStyle,如果是函數的形式,那麼吧調用結果第9行)放進去,否則就用分號進行分隔(12行),然後把樣式中所有的key,value用冒號進行分隔,所以最終執行的樣式字串類似於真正的css樣式表的書寫格式】、

本文出自 “平行線的凝聚” 部落格,請務必保留此出處http://supercharles888.blog.51cto.com/609344/1186603

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.