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//能够利用该顺序来合理执行一些初始化逻辑