sencha touch 有一套自己的類機制,可以以面向對象的方式去寫代碼,封裝業務邏輯,sencha touch 的組件、插件、api等都建立在這一套類機制的上面
在實際開發中,我們需要遵循這一套機制,以免造成不必要的麻煩。
?
所以的類都是繼承于Ext.Base
java中char的用法,定義一個類的語法:Ext.define(className, properties);
其中className是類名,properties屬于配置。
?
sencha touch開發推薦使用mvc結構,在這里我推薦以下結構
jquery touchmove、
如圖所示,我們一般在app文件夾中進行開發,其中config屬于全局配置文件,是一個靜態類
代碼如下:
1 //全局配置文件 2 Ext.define('app.config', { 3 //設置別名是為了方便調用,這樣直接config.name就能獲取到變量。 4 alternateClassName: 'config', 5 statics: { 6 version: '1.0.0', 7 used: { 8 add: 'http://www.361y.cn:8080/Json/Used.asmx/Add', 9 update: 'http://www.361y.cn:8080/Json/Used.asmx/Update', 10 destroy: 'http://www.361y.cn:8080/Json/Used.asmx/Delete', 11 list: 'http://www.361y.cn:8080/Json/Used.asmx/List', 12 one: 'http://www.361y.cn:8080/Json/Used.asmx/One' 13 } 14 } 15 });
如上所示,className的命名屬于命名空間,此靜態類的className是app.config,在這里表示app文件夾中的config.js文件。
蘋果touch功能。為了方便調用,我們為他配置了alternateClassName屬性。
我們在statics屬性中配置全局變量,此類中我們只是配置了變量。
?
我們還可以在里面配置方法,不過為了方便維護,在另一個靜態類中進行配置。
haptic touch如何開啟。代碼如下:
1 //公用類 2 Ext.define('app.util', { 3 alternateClassName: 'util', 4 statics: { 5 //比較兩個對象是否相等 6 equals: function (x, y) { 7 if (x === y) { 8 return true; 9 } 10 if (!(x instanceof Object) || !(y instanceof Object)) { 11 return false; 12 } 13 if (x.constructor !== y.constructor) { 14 return false; 15 } 16 for (var p in x) { 17 if (x.hasOwnProperty(p)) { 18 if (!y.hasOwnProperty(p)) { 19 return false; 20 } 21 if (x[p] === y[p]) { 22 continue; 23 } 24 if (typeof (x[p]) !== "object") { 25 return false; 26 } 27 if (!Object.equals(x[p], y[p])) { 28 return false; 29 } 30 } 31 } 32 for (p in y) { 33 if (y.hasOwnProperty(p) && !x.hasOwnProperty(p)) { 34 return false; 35 } 36 } 37 return true; 38 }, 39 //重寫ajax(需要初始化) 40 overrideAjax: function () { 41 var me = this; 42 //開始加載 43 Ext.Ajax.on('beforerequest', 44 function (connection, options) { 45 if (!options.hidMessage) { 46 me.showMessage('正在努力加載中...'); 47 } 48 }); 49 //加載成功 50 Ext.Ajax.on('requestcomplete', 51 function (connection, options) { 52 me.hideMessage(); 53 }); 54 //加載失敗 55 Ext.Ajax.on('requestexception', 56 function (connection, options) { 57 if (!options.hidMessage) { 58 me.showMessage('加載失敗,請檢查網絡是否正常...', true); 59 } 60 }); 61 }, 62 //重寫list(需要初始化) 63 overrideList: function () { 64 //重寫分頁插件 65 Ext.define("Ext.zh.plugin.ListPaging", { 66 override: "Ext.plugin.ListPaging", 67 config: { 68 //自動加載 69 autoPaging: true, 70 //滾動到最底部時是否自動加載下一頁數據 71 noMoreRecordsText: '沒有更多內容了', 72 loadMoreText: '加載更多...' //加載更多按鈕顯示內容 73 } 74 }); 75 //重寫下拉刷新 76 Ext.define("Ext.zh.plugin.PullRefresh", { 77 override: "Ext.plugin.PullRefresh", 78 config: { 79 lastUpdatedText: '上次刷新時間:', 80 loadedText: '等一會再刷新吧...', 81 loadingText: '加載中...', 82 pullText: '下拉可以手動刷新', 83 releaseText: '松開可以刷新', 84 lastUpdatedDateFormat: 'Y-m-d H:i' 85 } 86 }); 87 //重寫List 88 Ext.define("Ext.zh.List", { 89 override: "Ext.List", 90 config: { 91 //取消選擇效果 92 selectedCls: '', 93 //禁用加載遮罩,防止跳轉時頁面卡頓,使用統一的遮罩效果 94 loadingText: false, 95 cls: 'list', 96 deferEmptyText: false, 97 emptyText: '沒有更多內容了' 98 } 99 }); 100 }, 101 //重寫Pick相關(需要初始化) 102 overridePick: function () { 103 Ext.Date.monthNames = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]; 104 Ext.define("Ext.zh.DatePicker", { 105 override: "Ext.picker.Date", 106 config: { 107 yearFrom: 2000, 108 monthText: '月', 109 dayText: '日', 110 yearText: '年' 111 } 112 }); 113 Ext.define("Ext.local_zh_cn.Picker", { 114 override: "Ext.picker.Picker", 115 applyDoneButton: function (config) { 116 if (config) { 117 if (Ext.isBoolean(config)) { 118 config = {}; 119 } 120 if (typeof config == "string") { 121 config = { 122 text: config 123 }; 124 } 125 Ext.applyIf(config, { 126 ui: 'action', 127 align: 'right', 128 text: '確定' 129 }); 130 } 131 return Ext.factory(config, 'Ext.Button', this.getDoneButton()); 132 }, 133 applyCancelButton: function (config) { 134 if (config) { 135 if (Ext.isBoolean(config)) { 136 config = {}; 137 } 138 if (typeof config == "string") { 139 config = { 140 text: config 141 }; 142 } 143 Ext.applyIf(config, { 144 align: 'left', 145 text: '取消' 146 }); 147 } 148 return Ext.factory(config, 'Ext.Button', this.getCancelButton()); 149 } 150 151 }); 152 }, 153 //app初始化執行 154 inIt: function () { 155 this.overrideList(); 156 this.overrideAjax(); 157 this.addMessage(); 158 this.overridePick(); 159 } 160 } 161 });
如此我們可以通過util.equals('a','b')調用指定方法,另外我們可以通過this來進行內部調用
?
以上兩個類不會自動創建,我們必須創建之后才能調用。一般我們在app.js中進行創建
iphone touch,代碼如下:
1 Ext.application({ 2 name: 'app', 3 requires: ['app.config','app.util', 'Ext.MessageBox'], 4 controllers: ['Main', 'Used', 'User', 'Job'], 5 launch: function () { 6 // Destroy the #appLoadingIndicator element 7 Ext.fly('appLoadingIndicator').destroy(); 8 util.inIt(); 9 // Initialize the main view 10 Ext.Viewport.add(Ext.create('app.view.Main')); 11 } 12 });
在此代碼中我們通過requires進行了創建。
值得注意的是,全局變量,公共方法不止以上一種寫法,你可以自行嘗試一下其他寫法。
?
getchars、下面來說一說普通類,例如一個視圖。
代碼如下:
1 Ext.define('app.view.About', { 2 alternateClassName: 'about', 3 extend: 'Ext.Container', 4 xtype: 'about', 5 requires: ['ux.plugin.ConHref'], 6 config: { 7 title: '關于我們', 8 margin: 10, 9 plugins: 'conHref', 10 html: '<p>“拋磚網”國內首家首創純實戰型培訓機構,提供在線培訓、技術指導及答疑!</p><br/><p>團隊通過360全方位技術培訓+1度手把手技術指導,保證每一個學員能最快掌握實際工作技能;</p><br/><p>讓每一個學員都能站在我們的肩膀上,展翅高飛。趕快關注“拋磚網”。</p><br/><p>網址:<a href="http://www.361y.cn">www.361y.cn</a></p><p>QQ群:263271569</p><p>官方微信號:paozhuanedu</p><br/><p><strong>本期課程說明及付費鏈接:</strong></p><p><a href="http://item.taobao.com/item.htm?id=36768998716">item.taobao.com/item.htm?id=36768998716</a></p>' 11 } 12 });
?
這是一個視圖類,所在路徑為app/view/About.js
sencha Touch權威指南,在這里設置alternateClassName是為了方便創建,我們可以通過Ext.create('about')來創建類,等同于
Ext.create('app.view.About')
extend屬性表示他繼承于Ext.Container這個類。
xtype是為了方便在控制層中進行監聽,通常此屬性是必須的。
requires表示這個類所依賴的類,在這里是指一個插件。通過config.plugins來使用
java char的用法,config表示此類中的各種配置,框架自動幫每一個配置項添加了以下方法:
getter方法 - 如getName就是返回name的當前值。
setter方法 - 如getName就是為name設置一個新值。
getter和setter都是自動生成的,建議大家使用它們來存取類里面的數據。ST的每一個組件都使用了getter和setter的模式,這意味著如果我們知道一個配置項,也就知道如何獲取和設置它的值了。
sencha的中文。這也讓你的的代碼更整潔。
如果你需要在視圖創建時就添加一個按鈕,并且能夠動態更新。
可以如下:
1 /** 2 * 基于Ext.navigation.Bar 3 * 去除動畫切換等功能 4 * 可以靈活的在NavigationView子項中配置屬性 5 * 小寫開頭表示這是私有控件,不能直接使用 6 */ 7 Ext.define('ux.navigationBar', { 8 extend: 'Ext.TitleBar', 9 requires: [ 10 'Ext.Button', 11 'Ext.Spacer' 12 ], 13 config: { 14 /*導航欄標題*/ 15 title: null, 16 /*item默認類型*/ 17 defaultType: 'button', 18 layout: { 19 type: 'hbox' 20 }, 21 /*返回按鈕*/ 22 backButton: { 23 align: 'left', 24 ui: 'back', 25 hidden: true 26 } 27 }, 28 /*初始化配置*/ 29 constructor: function (config) { 30 config = config || {}; 31 if (!config.items) { 32 config.items = []; 33 } 34 this.callParent([config]); 35 }, 36 /*創建返回按鈕*/ 37 applyBackButton: function (config) { 38 return Ext.factory(config, Ext.Button, this.getBackButton()); 39 }, 40 /*更新返回按鈕*/ 41 updateBackButton: function (newBackButton, oldBackButton) { 42 if (oldBackButton) { 43 this.remove(oldBackButton); 44 } 45 if (newBackButton) { 46 this.add(newBackButton); 47 48 newBackButton.on({ 49 scope: this, 50 tap: this.onBackButtonTap 51 }); 52 } 53 }, 54 /*點擊返回按鈕時觸發*/ 55 onBackButtonTap: function () { 56 this.fireEvent('back', this); 57 } 58 });
如上,applyBackButton方法在視圖創建時會自動調用,只有返回的值部位false,并且不等于舊的值,就會自動觸發updateBackButton方法,我們可以在里面進行邏輯處理。
getchar的功能。?
另外一個類還值得主要的屬性有:
alias?:類似于alternateClassName,但是它的值只能是string數組
inheritableStatics:可繼承的靜態方法列表
mixins?:額外需要繼承的類
platformConfig:特殊平臺或者主題中的默認配置
singleton:是否單例模式
uses?:不一定依賴的類
?