Ext JS 4簡介javascript
Ext JS 4目前是Sencha的產品,4.x的正式版本號是4.0.7。Ext JS 4提供商業版本,但若是您的項目是開源的,則能夠無償使用Ext JS 4。Ext JS的論壇目前很是活躍;Ext JS還在不但地升級改進,據Sencha官方統計,使用Ext JS的開發者數目在一百萬以上。css
Ext JS 4與以前版本的比較html
清單 1. 按需加載類的例子前端
這個特性實際上是基於全新設計的類系統的,詳見下面的小結。不一樣於先前版本:即便用到Ext JS框架中不多一部分單元,Ext JS也會加載全部的框架,按需加載只加載須要的類。所以按需加載類爲JS優化和減小內存消耗提供了一個有效途徑。Sencha爲此還提供了SDK工具對JS代碼進行Minify,在部署前運行Minify對JS代碼最小化後,將獲得一個最小JS集合。java
MVC的概念很簡單,但實際項目中運用MVC模式將代碼組織起來會不會沒那麼簡單?答案在後面的章節「介紹開發Ext JS 4的利器 : Sencha Architect 2」中,該章節會詳細介紹怎樣用該工具開發MVC模式的Ext JS程序。程序員
爲何要運用MVC架構MVC的概念web
MVC是一種成熟的軟件設計模式。MVC模式的目的是實現一種動態的程序設計,使後續對程序的修改和擴展簡化,而且使程序某一部分的重複利用成爲可能。除此以外,此模式經過對複雜度的簡化,使程序結構更加直觀。軟件系統經過對自身基本部份分離的同時也賦予了各個基本部分應有的功能。專業人員能夠經過自身的專長分組:算法
MVC模式的特色:數據庫
運用MVC之前:設計模式
運用MVC之後:
圖 1.文件結構
清單 2.入口文件
整個工程僅此一個HTML文件,供十一行,其中demo.js是工程的啓動文件,裏面包含了全部UI widget的構建,後面會具體介紹。
入口定義在Ext.application({...})中,這是Ext JS 4爲開發MVC應用新增的函數,咱們能夠在裏面引入初始時所需的Controller、View或Model,在launch函數中編寫初始代碼,和之前在Ext.onReady()中同樣。由於Ext引擎會在Ext.application({...})函數執行時建立一個全局application實例並能在Controller中被引用獲得 (this.application.*),因此咱們也能夠在application中定義一些公共函數,甚至註冊一些事件,方便其它Controller調用。
"model"文件夾中只有模型相關的類定義,每一個模型定義必須包含字段,還能定義字段校驗規則,不一樣模型之間的關聯,以及數據代理(鏈接服務器存取數據)。好比僱員\部門對應兩類模型,體現爲兩個類文件"Employee"和"Department"。
"view"文件夾中定義了全部的 widget,每個 widget 對應一個類文件。view 的代碼屬於靜態代碼,後面將提到怎樣用工具自動生成。
"controller"文件夾中的控制器按管理範圍的不一樣劃分爲不一樣的類文件,其中每個控制邏輯都包括初始化、組件事件監聽以及引用等。好比,導航菜單的控制器會包含對主頁面菜單按鈕的動做監聽」click「,並在該事件中負責建立相應的子頁面;而子頁面對應的控制器只負責該頁面中的組件的行爲,如提交按鈕的點擊等。另外控制器自己能被動態加載,在下文的例子中咱們還能夠看到,不一樣的控制器被加載的時機和順序是由用戶行爲(如點擊某按鈕)控制的。其實這個特性是基於依賴於 Ext JS 4 的動態加載類的新特性的。詳見"按需加載類"一節。
因而可知,運用MVC後HTML裏再也不直接寫JS了,JS按邏輯、職責分門別類存於不一樣的目錄,對應到不一樣的文件中。總體邏輯更加條理
入口定義在Ext.application({...})中,這是Ext JS 4爲開發MVC應用新增的函數,咱們能夠在裏面引入初始時所需的controller、view或model,在launch函數中編寫初始代碼,和之前在Ext.onReady()中同樣。由於Ext引擎會在Ext.application({...})函數執行時建立一個全局application實例並能在controller中被引用獲得 (this.application.*),因此咱們也能夠在application中定義一些公共函數,甚至註冊一些事件,方便其它controller調用。
"model"文件夾中只有模型相關的類定義,每一個模型定義必須包含字段,還能定義字段校驗規則,不一樣模型之間的關聯,以及數據代理 ( 鏈接服務器存取數據 )。好比僱員\部門對應兩類模型,體現爲兩個類文件"Employee"和"Department"。
"view"文件夾中定義了全部的widget,每個widget對應一個類文件。view的代碼屬於靜態代碼,後面將提到怎樣用工具自動生成。
"controller"文件夾中的控制器按管理範圍的不一樣劃分爲不一樣的類文件,其中每個控制邏輯都包括初始化、組件事件監聽以及引用等。好比,導航菜單的控制器會包含對主頁面菜單按鈕的動做監聽」click「,並在該事件中負責建立相應的子頁面;而子頁面對應的控制器只負責該頁面中的組件的行爲,如提交按鈕的點擊等。另外控制器自己能被動態加載,在下文的例子中咱們還能夠看到,不一樣的控制器被加載的時機和順序是由用戶行爲(如點擊某按鈕)控制的。其實這個特性是基於依賴於Ext JS 4的動態加載類的新特性的。詳見"按需加載類"一節。
因而可知,運用MVC後HTML裏再也不直接寫JS了,JS按邏輯、職責分門別類存於不一樣的目錄,對應到不一樣的文件中。
開發Ext JS 4的利器:Sencha Architect
Sencha Architect是Sencha公司出品的一款輔助ExtJS開發的商業IDE軟件,能幫助ExtJS開發人員更加專一於核心JS代碼的開發,從而大大減小花費在編寫界面、組織代碼等反覆性的工做上的時間。筆者寫做時的工具版本是2.0.0 Build 412,此工具最大的特色是能幫助用戶管理符合MVC模式的代碼。例如,視圖類代碼能經過拖放組件結合屬性設置的方式徹底自動生成,不用寫手一行代碼。其它如Model、Store和Controller的代碼能經過屬性設置,方法、事件設置自動生成。理想狀況下,一個熟練的ExtJS開發者在使用Sencha Architect時,百分之九十以上的時間會花在controller的實現和自定義組件(包括 override 一些組件)的開發。這一點也不誇張,由於在Sencha Architect中開發界面實在過輕鬆了。感興趣的朋友能夠從官網下載Sencha Architect的30天試用版嚐嚐鮮。
主要特性有:
經過拖放組件的方式生成複雜視圖。
圖 2.視圖設計
設計好的視圖,能方便切換到代碼模式下預覽,拷貝或導出。
圖 3.模式切換
圖 4.屬性面板
圖 5.導航面板
示例和代碼
本文所指的入口代碼是什麼?
相信讀者對Ext.onReady()不會陌生,本文所指的入口代碼的功能與Ext.onReady() 是同樣的,不一樣在於,新版的Ext JS 4將命名空間和全局application變量天然地融合在入口函數中,開發者很容易從Model、View或Controller中調用application中的函數、變量和事件,並從使用命名空間的過程當中獲益,使得MVC的開發變得更方便。
下面的示例程序是一個很是實用的集表單提交,表格應用和圖表顯示的綜合運用的例子。因爲篇幅限制,本文只列舉主要的 JS 單元,感興趣的朋友請到本文末尾處下載完整的示例程序。
本示例使用了默認的appFolder:app,實際中用戶能夠覆蓋此屬性,使用符合項目要求的路徑名。我在項目中傾向於appFolder中的全部類由Sencha Architect工具維護,經過配置 mvn,在compile時將appFolder中生成的類拷貝到webApp中。手工維護的JS文件放在獨立的命名空間中(稱其爲擴展空間吧),並在入口中聲明,這樣能被application引用並加載,同時在擴展空間的類也能 equire到application對應命名空間中的類,這樣作的好處是,您能將override的代碼移出來放到擴展空間中,另外還能放一些項目中用到的插件。
清單 3. 入口代碼
清單 4.圖表子頁面控制器代碼
圖 6.表單
圖 7.表格
圖 8.圖表
項目中的主要問題和解決辦法
(1)此工具能生成幾乎全部必須的代碼,但對於手工編寫的部分 JS 代碼,本文推薦在 webApp 下創建獨立的目錄,並在入口文件中定義對應的路徑到命名空間的映射。
(2)用編譯工具如 mvn 將生成目錄拷貝到 webApp 中。
(1)劃分好Controller的範圍和生命週期。
(2)劃分好頁面功能區,而後肯定須要哪些Controller;區分哪些是動態的,好比一個子窗口或新頁籤,對應Controller的加載時機也應該是動態的。
(3)將須要動態加載的Controller從入口文件定義中移除。
(4)這樣作的一個顯而易見的好處是,避免初始頁面"過載";另外能避免因init()調用太早致使事件綁定失敗,緣由也顯而易見:須要綁定事件的組件尚未被建立出來。
設置過storeId的store將在storeManager中註冊爲單例;有時這是個限制,好比想在多個view實例中擁有獨立的store時,Sencha Architect目前沒有好的辦法。辦法有二,一是 override view,讓每一個view在create時擁有本身的store;二是在Model中設置proxy( 固然這時得移除 store 中的 proxy)。第二種方法來自Sencha的技術支持,但我還沒試過。
我在使用Sencha Architect的時候碰到過這個問題,Architect能顯示熱數據,即屬性設置好後,設計器能實時將數據做爲預覽顯示出來;我一開始就碰到樹不能顯示的問題,接着是顯示了又沒法展開下級。
(1)設置好store的proxy中的idProperty、root屬性。我一開始設置錯了root(設置了一個不存在的 field),後來查了好久,找到了這個位置 , 問題解決。中間還懷疑是工具的 bug。 瞧,一個很不起眼的地方,但很打擊士氣。
(2)設置好樹節點所用到的Model中的idProperty屬性。這個屬性決定點擊樹的節點往下鑽取時往服務器傳遞的參數。
總結
Ext JS從4.0之後有了很大的變化,特別是增長了對MVC開發模式的支持,給Ext JS開發注入了新的活力,也極大地方便了大型WEB項目的開發。本文經過對使用MVC先後的比較,透過一個很實用的MVC實例,演示了運用Ext JS 4 MVC開發Web前端比用之前的版本要簡單不少;文章最後,本人根據本身在開發過程當中的經歷提出了一些常見的困難以及解決辦法。但願讀者能從中獲得一些啓發和幫助。