Sencha Touch開發一些須要注意的問題
現在Sencha Touch已經升級到2.4了,功能更增強大,性能也有所提高。
但因爲一些功能的改進,文檔並無及時更新,致使開發時會遇到一些困難。
結合我使用的經驗總結一些須要注意的地方,但願能幫助你們。
-------------------
Sencha Touch的開發流程
下載SDK,安裝Sencha Cmd。
建立項目: css
sencha generate app MyApp ../test打包項目(壓縮,便於部署)
sencha app build由cmd生成的項目會自動加載類庫文件,文件太多,致使等待時間過長,
Ext.application({ name: 'MyApp', //The name is used to create a single global namespace for your entire app requires: [ 'Ext.MessageBox', 'Ext.navigation.View', 'Ext.dataview.List', 'Ext.plugin.PullRefresh', 'Ext.plugin.ListPaging' ], controllers:[ 'Main' ], views: [ 'Main', 'ArticleList' ], models:[ 'MyApp.model.Article' ], stores:[ 'MyApp.store.Articles' ], icon: { '57': 'resources/icons/Icon.png', '72': 'resources/icons/Icon~ipad.png', '114': 'resources/icons/Icon@2x.png', '144': 'resources/icons/Icon~ipad@2x.png' }, isIconPrecomposed: true, startupImage: { '320x460': 'resources/startup/320x460.jpg', '640x920': 'resources/startup/640x920.png', '768x1004': 'resources/startup/768x1004.png', '748x1024': 'resources/startup/748x1024.png', '1536x2008': 'resources/startup/1536x2008.png', '1496x2048': 'resources/startup/1496x2048.png' }, launch: function() { // Destroy the #appLoadingIndicator element Ext.fly('appLoadingIndicator').destroy(); // Initialize the main view Ext.Viewport.add(Ext.create('MyApp.view.Main')); }, onUpdated: function() { Ext.Msg.confirm( "Application Update", "This application has just successfully been updated to the latest version. Reload now?", function(buttonId) { if (buttonId === 'yes') { window.location.reload(); } } ); } });
Ext.define("MyApp.model.Article", { extend: "Ext.data.Model", config: { fields: [ {name: "title", type: "string"}, {name: "content", type: "string"}, {name: "add_time", type: "string"} ] } }); Ext.define('MyApp.store.Articles',{ extend:'Ext.data.Store', config:{ model: "MyApp.model.Article", proxy: { type: "ajax", url : listUrl, reader: { type: "json", rootProperty: "root" } }, autoLoad: true, pageSize:10, listeners:{ 'beforeload':function(store){ //console.log('start'); if(store.getAllCount()==0){ showMask(); } }, 'load':function(){ hideMask(); } } } });----------------------------------
Ext.create('Ext.Panel',{ layout:{ type:'card', animation:'fade' }, items:[ { ..... }, { ..... } ] });
// 根據id獲取元素,返回Ext.Element類型 var el = Ext.get("my-div"); // 根據HTMLElement獲取元素,返回Ext.Element類型 var el = Ext.get(myDivElement); //HTMLElement是普通的dom對象 //Ext.Element 獲取全部img 返回數組(HTMLElement) el.query('img'); //Ext.Element 獲取第一個img 返回單個對象(HTMLElement) el.down('img',true); //返回單個對象(Ext.dom.Element) el.down('img'); //Ext.dom.Element修改樣式 el.applyStyles({ color:'red' }); //普通HTMLElement修改樣式 el.style.width = '100%';
//建立loading Ext.Viewport.setMasked({ xtype:'loadmask', message:'請稍後...' }); //關閉loading 爲何不是unMask?很奇怪 Ext.Viewport.unmask(); //也可使用 Ext.Viewport.setMasked(false);-----------------------------------
var panel = Ext.create('Ext.Panel', { layout: 'card', items: [ { html: "First Item" }, { html: "Second Item" }, { html: "Third Item" }, { html: "Fourth Item" } ] }); panel.setActiveItem(1);
Ext.create('Ext.Container', { fullscreen: true, layout: 'hbox', items: [ { docked: 'top', //能夠是top bottom right left xtype: 'panel', height: 20, html: 'This is docked to the top' }, { xtype: 'panel', html: 'message list', flex: 1 }, { xtype: 'panel', html: 'message preview', flex: 2 } ] });
layout: { type: 'hbox', align: 'start', //垂直方向停靠起始位置 pack: 'start' //水平方向停靠起始方向,效果等同左對齊 }, align和pack可能的值: start center 居中對齊 end justify 兩端對齊(自適應父元素的寬度或高度)
var layout = container.getLayout();-----------------------------------------
Ext.define('MyApp.controller.Sessions', { extend: 'Ext.app.Controller', config: { refs: { loginForm: 'formpanel' //組件查詢 使用xtype }, control: { 'formpanel button': { //也可使用相似於css選擇器的查詢方式 tap: 'doLogin' //該方法在下面定義 } } }, doLogin: function() { var form = this.getLoginForm(), //根據refs中的loginForm自動生成getLoginForm方法 values = form.getValues(); MyApp.authenticate(values); } });
//獲取指定屬性的panel Ext.ComponentQuery.query('panel[cls=my-cls]') //模糊查詢 Ext.ComponentQuery.query('panel[cls~=my-cls]') //匹配結果 Ext.create('My.Panel', { cls : 'foo-cls my-cls bar-cls' }); //根據id查詢 Ext.ComponentQuery.query('#myCt panel'); //查詢孩子節點 var directChildPanel = Ext.ComponentQuery.query('#myCt > panel'); //查詢多個組件 Ext.ComponentQuery.query('gridpanel, treepanel'); //獲取禁用的元素 var disabledFields = myFormPanel.query("{isDisabled()}");
Controller#init functions called Profile#launch function called Application#launch function called Controller#launch functions called//能夠利用該順序來合理執行一些初始化邏輯