ext設計模式

來源:互聯網
上載者:User
Ext源碼分析之模板模式解說——Ext組件渲染render的全過程詳述

關鍵字: ext

模板模式是設計模式中很重要的一個知識點,我在模式總結——模板方法這篇文章中已有總結,在物件導向設計中有著舉足輕重的地位。

在Ext中更是發揮的淋漓盡致,為什麼這麼說呢?Ext中的組件有著很深的繼承關係,很多方法都有著重複,而且不僅
是代碼上的重複,更多的是流程上的重複
比方說,Ext.Panel吧,將一個Panel顯示在瀏覽器中,其過程叫做render(渲染)。有這麼幾道工序:
第一、觸發”beforeRender”事件
第二、得到這個Panel的父節點(針對DOM來說),即容器,也就是供Panel入住的那個容器
第三、設定rendered=true
第四、調用onRender方法,這步是最重要的,也就是如何將組件顯示在瀏覽器上,涉及到很多流程,一會詳解
第五、設定這個panel的css
第六、觸發”render”事件,指的是當render完成後,觸發的事件
第七、調用aferRender,這步和第四步一樣,是很重要的流程之一
第八、看看要不要將這個panel隱藏或者失效,如果使用者佈建了hidden或者disable
第九、設定這個panel的位置,也就是doLayout,布局

再來,Ext.Panel的子類,Ext.TabPanel,也有這麼幾道工序:
第一、觸發”beforeRender”事件
第二、得到這個Panel的父節點(針對DOM來說),即容器,也就是供Panel入住的那個容器
第三、設定rendered=true
第四、調用onRender方法,這步是最重要的,也就是如何將組件顯示在瀏覽器上,涉及到很多流程,一會詳解
第五、設定這個panel的css
第六、觸發”render”事件,指的是當render完成後,觸發的事件
第七、調用aferRender,這步和第四步一樣,是很重要的流程之一
第八、看看要不要將這個panel隱藏或者失效,如果使用者佈建了hidden或者disable
第九、設定這個panel的位置,也就是doLayout,布局
第十、設定activeTab,也就是啟用哪個Tab面板

僅僅多了第十個步驟。

其他例子不舉了,都是僅僅在最後幾個步驟上不同而已,大家要說了,這個那是什麼模板模式,不就是最簡單的繼承嗎?
錯了,繼承指的是屬性和方法的繼承,但現在是一個流程,一個系列的工序”繼承”,這就是模板模式了。

我們來看,應用了模板模式後的工序

Ext.TabPanel只有2道工序了
第一、完成Panel渲染的工序
第二、設定activeTab,也就是啟用哪個Tab面板

Ext.Panel一道工序
第一、完成Ext.Container的渲染工序

Ext.Container有2道工序
第一、完成BoxComponent的渲染工序
第二、設定這個panel的位置,也就是doLayout,布局

Ext.BoxComponent一道工序
第一、完成Ext.Component的渲染工序

Ext.Component八道工序
第一、觸發”beforeRender”事件
第二、得到這個Panel的父節點(針對DOM來說),即容器,也就是供Panel入住的那個容器
第三、設定rendered=true
第四、調用onRender方法,這步是最重要的,也就是如何將組件顯示在瀏覽器上,涉及到很多流程,一會詳解
第五、設定這個panel的css
第六、觸發”render”事件,指的是當render完成後,觸發的事件
第七、調用aferRender,這步和第四步一樣,是很重要的流程之一
第八、看看要不要將這個panel隱藏或者失效,如果使用者佈建了hidden或者disable

下面把流程圖展示出來(配合上onRender和afterRender)

我們來看

那麼在Ext是如何讓這些流程在不同類之間自由跳轉的呢?這就是大名鼎鼎的call和apply在起著重要作用了
比如我們來看如下代碼
Ext.Panel.superclass.onRender.call(this, ct, position);
什麼意思?this就是panel的意思,Ext.Panel.superclass就是Ext.Container,這句代碼的意思就是“panel,你給我去執行container裡面的onRender方法”
那麼在Ext.Container的onRender方法有存在著
Ext.Container.superclass.onRender.call(this, ct, position);
這樣的代碼,這裡的this還是指panel,不懂看,這裡所有的this統統指panel對象,記住!意思是“panel,你再給我執行container父類裡面的onRender方法”
接著又會出現“panel,你再給我執行container父類的父類裡面的onRender方法”,一層層遞迴下去了,呵呵

仔細的朋友去看container的時候會發現沒有onRender方法,不錯,代碼裡確實沒有,但是執行起來之後就有了,不懂?看我的
Ext源碼分析源碼分析之Ext的繼承模式解說

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.