從sencha touch 2.4.2升級到ext js 6,cmd版本升級到6.0之后發生了很多變化
首先從cmd說起,cmd 6 中sencha app build package不能使用了,sencha app build native好像也不能用了。
有個好消息就是我們可以用
sencha ant native build
sencha ant package build
這兩個命令,目測和以前的效果差不多了
然后再說說ext js 6相對sencha touch 2.4.2的變化
首先最只管的就是在網頁上滾動條變了,如圖

移動端沒有變化,如圖

想要統一他們的顯示效果可能需要花一下心思看看源碼了
然后控制層和模型層發生了變化
以前的控制層是這樣,如圖

現在是這樣,如圖

也就是說views,models,還有圖片上沒顯示的stores現在是和config配置同級了,樓主搞了半天才明白錯在那里
另外模型層也發生了變化
以前是這樣,如圖

現在是這樣,如圖

沒有了config,奇怪的是數據倉庫層,也就是store沒有變化,很奇怪。
另外原來sencha touch如果你重寫了模型和驗證模塊,現在大概是不能用了,需要重新看源碼來寫了,樓主的自定義驗證模塊完全就廢了。
最后就是路由這一塊發生了變化,這個變化挺大的。例如
1 this.redirectTo('redirect/newsInfo'); 2 util.recordLoad(this.getInfo(), config.news.info, { 3 NewsID: record.get('id'), 4 UserID: config.userMes ? config.userMes.id : 0 5 }, record, 'Info');
在sencha touch中,this.redirectTo('redirect/newsInfo');這行代碼會觸發我在main控制層中的視圖切換方法,也就是以下代碼。
1 showView: function (view, count) { 2 //如果正在登錄中,中斷執行 3 if (config.isLogin) { 4 return; 5 } 6 var main = this.getMain() || this.getLogin(), 7 params = config.tmpParams; 8 if (main) { 9 //登錄檢測 10 //根據config.ckLogin和用戶信息檢測 11 if (config.ckLogin[view] && !config.userMes.id) { 12 //沒有登錄則跳轉到登錄頁面 13 params = params || {}; 14 //為登錄頁面添加配置,登錄成功后判斷跳轉位置 15 params.redirect = view; 16 view = 'userLogin'; 17 } 18 if (!view) { 19 count = 1; 20 } 21 if (count && !Ext.isNumber(count) && count.match(/^\+?[1-9][0-9]*$/)) { 22 count = Number(count); 23 } 24 if (count) { 25 main.popAndPush(view, count, params); 26 } else { 27 main.push(view, params); 28 } 29 } 30 delete config.tmpParams; 31 }
在這里動態創建了newsInfo視圖,然后通過this.getInfo()方法獲取到視圖對象,最后給這個視圖賦值。
在ext js 6中,這個代碼完全失效了,經過測試發現showView方法的執行順序在util.recordLoad這段代碼之后執行了,也就是說這個時候this.getInfo()方法獲取的是一個null
怎么辦?我們可以這樣處理
this.redirectTo('redirect/newsInfo',true);
強制觸發路由事件,不過這樣你會發現showView這個方法被觸發了兩次,這樣怎么可以!怎么辦?重寫路由這一塊!代碼如下
1 Ext.define('Ext.zh.util.History', { 2 override: 'Ext.util.History', 3 //因為在redirectTo里面已經觸發了方法,所以這里就不應該再次觸發,直接清空 4 handleStateChange: function (token) { 5 } 6 }); 7 Ext.define('Ext.zh.app.BaseController', { 8 override: 'Ext.app.BaseController', 9 redirectTo: function (token) { 10 if (token.isModel) { 11 token = token.toUrl(); 12 } 13 //立刻執行路由觸發的方法,沒有做重復觸發判定,使用過程中注意處理 14 Ext.app.route.Router.onStateChange(token); 15 //加入歷史記錄,如果不想url發生變化,可以注釋掉 16 //Ext.util.History.add(token); 17 return true; 18 } 19 });
這樣勉強達到了sencha touch中的效果,不過問題有來了,在ajax請求數據時,會有問題,代碼如下:
recordLoad: function (view, url, params, record, ckName) { //如果record存在,並且ckName這個字段中有值 //所以已經請求過了,直接設置值即可 if (record && record.get(ckName)) { view.setRecord(record); return; } //據需求決定用jsonp還是ajax //Ext.data.JsonP.request Ext.Ajax.request({ url: url, params: params, success: function (data) { //處理返回值,轉換為json對象 data = Ext.decode(data.responseText)[0] || Ext.decode(data.responseText); //如果模型存在,直接賦值,並且給詳細視圖賦值 //如果涉及到修改這一塊,模型存在會省很多事 //請看http://www.cnblogs.com/mlzs/archive/2013/05/29/3106241.html if (record) { record.set(data); view.setRecord(record); } else { //如果模型不存在,直接給詳細視圖賦值 view.setData(data); } } }); }
如果使用navigationView,在第二次進入視圖時會報錯,目前還沒找到解決方法!如圖

最后代碼改成這樣
config.tmpParams.record = record; this.redirectTo('redirect/newsInfo') util.recordLoad(config.news.info, { NewsID: record.get('id'), UserID: config.userMes ? config.userMes.id : 0 }, record, 'Info');
關鍵代碼 config.tmpParams.record = record;這里通過路由觸發的方法處理,會把record直接初始化給newsInfo視圖,這樣不會出錯,很奇怪。
1 recordLoad: function (url, params, record, ckName) { 2 //如果record存在,並且ckName這個字段中有值 3 //所以已經請求過了,直接設置值即可 4 if (record && record.get(ckName)) { 5 return; 6 } 7 //據需求決定用jsonp還是ajax 8 //Ext.data.JsonP.request 9 Ext.Ajax.request({ 10 url: url, 11 params: params, 12 success: function (data) { 13 //處理返回值,轉換為json對象 14 data = Ext.decode(data.responseText)[0] || Ext.decode(data.responseText); 15 record.set(data); 16 } 17 }); 18 },
感覺坑還是挺多的,各位有啥好的填坑方法記得告訴我。我會繼續分享我的心得。
