前言
ExtJS 是由 Sencha 公司釋出的 JS Framework,相對於其他前端框架來說,在風格上ExtJS給人一種中規中矩的感覺,而在處裡效率上Extjs要引入的依賴檔案“ext-all.js”太肥了(1.5MB左右),導致載入速度會相對來說較慢,所以正常情況下幾乎不可能在網路上看到Extjs寫的前端網站。另Extjs發光發熱的地方就是在企業辦公自動化(OA)上面,主要是Extjs封裝了大多數會使用到的前端元件(component),且非常適合應用在企業軟體開發,還有Extjs可以輕鬆且快速用程式碼刻出一個畫面(layout),省去了花時間在思考畫面排版及樣式的時間。看到Extjs就讓我回想起當初實習的單位外包給IBM做的系統就是使用ExtJS來開發前端,所以這篇來記錄一些實作上的筆記和重點!
ExtJS特色
- ExtJS最初是YUI(Yahoo UI)的一個擴充元件,後跳脫並自成一套客戶端的前端框架
- ExtJS具有多種實用的元件,且讓開發者不須花時間在前端的佈局(layout)
- Extjs可實現類MVC設計的模式
- 如果使用ExtJS開發的系統具有盈利的話,就必須要付點費用來取得Ext的企業授權,但只要遵循GPL協定或是非盈利的內部使用的都可以免費(像是公司內部使用、自己學習)。ExtJS授權形式有三種,具體官方說明在: link
- 目前最新ExtJS的版本是7.2.0 version,但現在版本好像沒有 GPL 授權的免費版, 只能下載 30 天試用版。而其他版本的ExtJS SDK和api文件都可以在下面的連結都可以取得
ExtJS套件安裝
下面是使用 Extjs 4.2.1-gpl.zip 解壓縮出來的Extjs來說明,資料夾內放了很多範例文件和有的沒的東西,但如果只是單純用 ExtJS 來學習或開發的話, 只需將目錄下的 ext-all.js 和 resources\css\ext-all.css 複製到專案目錄裡面,因為如果將解壓縮後的資料夾全部放進專案目錄會造成IDE的loading太重,另外 ext-all-debug.js 是開發階段能來使用的檔案,點開原始檔案可以發現會有很多註解和說明,所以引入ext-all-debug.js能夠在開發階段時顯示相關錯誤訊息
在html中的head的tag中引入剛剛的ExtJs的套件
1 | <head> |
相關版本引入說明
開始hello world程式
myFirst.html
1 | <html> |
layout.js
1 | Ext.onReady(function(){ |
結果圖
畫面渲染的元件
ExtJs可以替我們省去撰寫Html和css的麻煩,並可以加快開發速度,而且能夠渲染出風格都一致的畫面,主要是Ext提供了許多定義好的元件及版面配製。這邊要注意Ext的大部分可視元件都是繼承Ext.Component類別,像是我們常使用的Container、Button或textfield等元件都是繼承Component,下面紀錄一下常見的元件
Container
- 所有的畫面的最外層都會包一個Container,裡面可以包含layout、items或buttons等屬性的config設定,官方文件都有詳細說明
Button
Grid
Model
- 取代 Ext.data.Record 成為資料的核心
Store
- Store 就可以直接載入資料。同時 Store 支援 local 與 remote 排序、篩選和分組
- 可以定義不同 model 間多對多或一對多等的資歷關係
ExtJS事件處理機制
- ExtJS的事件分為自訂事件和瀏覽器事件
- 只要控制項是繼承Ext.util.Observable類別就可以擁有自訂事件,並可以設定事件的監聽器
- 簡單說流程是當某事件被觸發時,Ext會自動幫我們呼叫對應的監聽器,並呼叫事先定義好的事情
範例
Ext.panel.Panel
- 官方對Panel的定義是一種Container,且可以包含多種功能的元件(Component),並快速建立一個使用者介面,如下圖
1 | Ext.create('Ext.panel.Panel', { |
屬性 | 說明 | 備註 |
---|---|---|
title | 一個視窗的title | 可以不設定title |
bodyPadding | Panel body裡面的Padding大小 | 預設值是undefined |
collapsible | 這個Panel視窗是可以收縮的,會出現在Panel Header的右上角 | 預設是false |
width | Panel視窗的寬度 | 直接給數值就是pixel,如果要給比例就要加上雙引號如’25%’,表示在父類別容器中的寬度佔25% |
height | Panel視窗的高度 | 同上 |
html | 在Panel中使用html內容,像是可以加入<img>或<div>等等tag | html的內容一定會在所有元件下面,官方定義是HTML content is added after the component is rendered |
renderTo | 指定這個Panel要渲染到Html的哪一個地方 | 通常可以直接指定在Html的body中或某個標籤的Id,例如: 1.renderTo: document.body 2.renderTo: document.getElementById('myDiv') 3.renderTo: Ext.getBody() |
items | 官方定義是A single item, or an array of child Components to be added to this container ,表示放入這個Panel的其他子元件 |
xtype指的是類別的物件? |
buttons | 就是這個Panel包含的按鈕 |
ExtJS物件導向實現
- ExtJS的API支援物件導向的類別設計,讓我們可以快速定義一個具有繼承、封裝和多型的類別
- new和create差別
1 | //第一個參數是字串類型的類別名稱,第二個參數為object類型,來放入這類別的屬性和方法 |
重點說明
屬性 | 說明 | 備註 |
---|---|---|
callParent() | 一個視窗的title | callParent簡介 |
1 | Ext.onReady(function(){ |
this.callParent(arguments):呼叫父類建構函式,Extjs中規定:在繼承關係中,子類有建構函式,不會自動呼叫父類建構函式,如果需要執行父類建構函式,需要手動呼叫。
Reference
- https://stackoverflow.com/questions/14492179/to-initcomponent-or-not-to-initcomponent
- https://stackoverflow.com/questions/6290729/how-to-use-ext-define-in-extjs-4
- http://extjscanred.blogspot.com/2013/10/extutilobservable_26.html
- http://yhhuang1966.blogspot.com/2014/01/extjs-4.html
- http://yhhuang1966.blogspot.com/2014/07/extjs-4-gridpanel_8.html
- http://extjscanred.blogspot.com/2013/10/extpanel.html
- 取得組件
- 取得組件