建立第一个Sencha Touch应用

准备

开始开发前,请先到下面的地址下载Sencha Touch 2的包:http://www.sencha.com/products/touch/download/ 。下载完解压后你会发现包里有很多文件。里面有api文档、开发包和一些实例等等。现在,我们只需要sencha-touch-debug.js和resources/css/sencha-touch.css文件即可。(sencha-touch-debug.js文件里面是未经压缩的带注释的js代码,方便我们阅读和debug)。

包文件到手了,选上一个你喜欢的IDE,建立一个web项目并把文件引进吧。我选了Aptana Studio建立了以下目录结构:

 

开始种码

在根目录新建一个app.html文件,在app目录下新建一个app.js文件(用于编写我们的js代码)。然后,把需要的内容引进app.html文件中,如下:

 

  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
  5.     <title>First App</title>  
  6.     <link rel="stylesheet" href="js/lib/sencha-touch.css" type="text/css">  
  7.     <link rel="stylesheet" href="css/style.css" type="text/css">  
  8.     <script type="text/javascript" src="js/lib/sencha-touch-debug.js"></script>  
  9.     <script type="text/javascript" src="app/app.js"></script>  
  10. </head>  
  11. <body></body>  
  12. </html>  
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>First App</title>
    <link rel="stylesheet" href="js/lib/sencha-touch.css" type="text/css">
    <link rel="stylesheet" href="css/style.css" type="text/css">
    <script type="text/javascript" src="js/lib/sencha-touch-debug.js"></script>
    <script type="text/javascript" src="app/app.js"></script>
</head>
<body></body>
</html>


1.打开 app/app.js文件,正式开始编写我们第一个Sencha Touch App了。今天我们利用Tab Panel来建立一个拥有四个页面的App。首先,我们先建立一个Tab Panel,在app.js里种入如下代码:

 

 

  1. Ext.application({  
  2.     name: 'Sencha',  
  3.   
  4.     launch: function() {// 应用启动时执行该方法   
  5.         Ext.create("Ext.tab.Panel", {  
  6.             fullscreen: true,  
  7.             items: [  
  8.                 {  
  9.                     title: 'Home',  
  10.                     iconCls: 'home',  
  11.                     html: 'Welcome'  
  12.                 }  
  13.             ]  
  14.         });  
  15.     }  
  16. });  
Ext.application({
    name: 'Sencha',

    launch: function() {// 应用启动时执行该方法
        Ext.create("Ext.tab.Panel", {
            fullscreen: true,
            items: [
                {
                    title: 'Home',
                    iconCls: 'home',
                    html: 'Welcome'
                }
            ]
        });
    }
});



 

保存后,可用支持HTML5的浏览器(我是chrome爱好者)打开app.html文件观看效果,如下

 

现在,我们来改进一下这个页面:

 

  1. launch: function() {  
  2.         Ext.create("Ext.tab.Panel", {  
  3.             fullscreen: true,  
  4.             tabBarPosition: 'bottom',  // 将标签栏定位到底部   
  5.   
  6.             items: [  
  7.                 {  
  8.                     title: 'Home',  
  9.                     iconCls: 'home',  
  10.                     cls: 'home',// 添加了css class   
  11.   
  12.                     html: [  
  13.                         '<img src="http://staging.sencha.com/img/sencha.png" />',  
  14.                         '<h1>Welcome to Sencha Touch</h1>',  
  15.                         "<p>You're creating the Getting Started app. This demonstrates how ",  
  16.                         "to use tabs, lists and forms to create a simple app</p>",  
  17.                         '<h2>Sencha Touch 2</h2>'  
  18.                     ].join("")  
  19.                 }  
  20.             ]  
  21.         });  
  22.     }  
  23. });  
launch: function() {
        Ext.create("Ext.tab.Panel", {
            fullscreen: true,
            tabBarPosition: 'bottom',  // 将标签栏定位到底部

            items: [
                {
                    title: 'Home',
                    iconCls: 'home',
                    cls: 'home',// 添加了css class

                    html: [
                        '<img src="http://staging.sencha.com/img/sencha.png" />',
                        '<h1>Welcome to Sencha Touch</h1>',
                        "<p>You're creating the Getting Started app. This demonstrates how ",
                        "to use tabs, lists and forms to create a simple app</p>",
                        '<h2>Sencha Touch 2</h2>'
                    ].join("")
                }
            ]
        });
    }
});

 

打开css/style.css文件,输入:

 

  1. .home {text-align:center;}  
.home {text-align:center;}


然后,快快看看效果。

 

 

2.现在,让我们来建立第二个页面,blog页面。我们可以选择新建另一个js文件,然后修改app.html里面的引用;或者直接选择覆盖app.js:

 

  1. Ext.application({  
  2.     name: 'Sencha',  
  3.   
  4.     launch: function() {  
  5.         Ext.create("Ext.tab.Panel", {  
  6.             fullscreen: true,  
  7.             tabBarPosition: 'bottom',  
  8.   
  9.             items: [  
  10.                 {  
  11.                     xtype: 'nestedlist',// 这次建立一个嵌套列表(嵌套列表是什么,这里就不解释了)   
  12.                     title: 'Blog',  
  13.                     iconCls: 'star',  
  14.                     displayField: 'title',  
  15.   
  16.                     store: {// 这里是建立一个存放数据的data store,以后将对data store进行详细介绍   
  17.                         type: 'tree',  
  18.   
  19.                         fields: [  
  20.                             'title', 'link', 'author', 'contentSnippet', 'content',  
  21.                             {name: 'leaf', defaultValue: true}  
  22.                         ],  
  23.   
  24.                         root: {  
  25.                             leaf: false  
  26.                         },  
  27.   
  28.                         proxy: {// 我们使用ajax方式从google上获取一些blog的数据,通过jsonp作为传递的载体,所以要联网才能看到效果喔   
  29.                             type: 'jsonp',  
  30.                             url: 'https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://feeds.feedburner.com/SenchaBlog',  
  31.                             reader: {// 这个是读取数据的reader,数据取回来后通过reader转成可被js认识的数据对象,我们要教会reader如何读   
  32.                                 type: 'json',// 因为返回来的数据是json,我们要定义一个json reader   
  33.                                 rootProperty: 'responseData.feed.entries'  // 将数据里面的entries节点当作根节点去读取数据   
  34.                             }  
  35.                         }  
  36.                     },  
  37.   
  38.                     detailCard: {// 建立一个用于显示详细内容的panel   
  39.                         xtype: 'panel',  
  40.                         scrollable: true,  
  41.                         styleHtmlContent: true  
  42.                     },  
  43.   
  44.                     listeners: {// 这里是监听点击列表某一项后所执行的方法   
  45.                         itemtap: function(nestedList, list, index, element, post) {  
  46.                             this.getDetailCard().setHtml(post.get('content'));  
  47.                         }  
  48.                     }  
  49.                 }  
  50.             ]  
  51.         });  
  52.     }  
  53. });  
Ext.application({
    name: 'Sencha',

    launch: function() {
        Ext.create("Ext.tab.Panel", {
            fullscreen: true,
            tabBarPosition: 'bottom',

            items: [
                {
                    xtype: 'nestedlist',// 这次建立一个嵌套列表(嵌套列表是什么,这里就不解释了)
                    title: 'Blog',
                    iconCls: 'star',
                    displayField: 'title',

                    store: {// 这里是建立一个存放数据的data store,以后将对data store进行详细介绍
                        type: 'tree',

                        fields: [
                            'title', 'link', 'author', 'contentSnippet', 'content',
                            {name: 'leaf', defaultValue: true}
                        ],

                        root: {
                            leaf: false
                        },

                        proxy: {// 我们使用ajax方式从google上获取一些blog的数据,通过jsonp作为传递的载体,所以要联网才能看到效果喔
                            type: 'jsonp',
                            url: 'https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://feeds.feedburner.com/SenchaBlog',
                            reader: {// 这个是读取数据的reader,数据取回来后通过reader转成可被js认识的数据对象,我们要教会reader如何读
                                type: 'json',// 因为返回来的数据是json,我们要定义一个json reader
                                rootProperty: 'responseData.feed.entries'  // 将数据里面的entries节点当作根节点去读取数据
                            }
                        }
                    },

                    detailCard: {// 建立一个用于显示详细内容的panel
                        xtype: 'panel',
                        scrollable: true,
                        styleHtmlContent: true
                    },

                    listeners: {// 这里是监听点击列表某一项后所执行的方法
                        itemtap: function(nestedList, list, index, element, post) {
                            this.getDetailCard().setHtml(post.get('content'));
                        }
                    }
                }
            ]
        });
    }
});


种完没?一起来看看效果:

 

 

点击每一项后可以切换到详细内容页面。

 

3.完成了上面的工作,我们再来建立一个页面,Contact页面。种子如下,拿去种码吧:

 

  1. Ext.application({  
  2.     name: 'Sencha',  
  3.   
  4.     launch: function() {  
  5.         Ext.create("Ext.tab.Panel", {  
  6.             fullscreen: true,  
  7.             tabBarPosition: 'bottom',  
  8.   
  9.             items: [  
  10.                 {  
  11.                     title: 'Contact',  
  12.                     iconCls: 'user',  
  13.                     xtype: 'formpanel',// 这次建立的是form panel   
  14.                     url: 'contact.php',// 提交的action地址是contact.php。我们没有这个文件,所以,就不要提交了。   
  15.                     layout: 'vbox',  
  16.   
  17.                     items: [// 这里,我们有两个成员   
  18.                         {// 第一个成员是fieldset,将一些form元素包装起来。   
  19.                             xtype: 'fieldset',  
  20.                             title: 'Contact Us',  
  21.                             instructions: '(email address is optional)',  
  22.                             items: [  
  23.                                 {  
  24.                                     xtype: 'textfield',// input text   
  25.                                     label: 'Name'  
  26.                                 },  
  27.                                 {  
  28.                                     xtype: 'emailfield',// input email,html5添加进来的新成员   
  29.                                     label: 'Email'  
  30.                                 },  
  31.                                 {  
  32.                                     xtype: 'textareafield',// textarea   
  33.                                     label: 'Message'  
  34.                                 }  
  35.                             ]  
  36.                         },  
  37.                         {// 第二个成员,按钮   
  38.                             xtype: 'button',  
  39.                             text: 'Send',  
  40.                             ui: 'confirm',  
  41.                             handler: function() {  
  42.                                 this.up('formpanel').submit();// 处理点击事件的方法   
  43.                             }  
  44.                         }  
  45.                     ]  
  46.                 }  
  47.             ]  
  48.         });  
  49.     }  
  50. });  
Ext.application({
    name: 'Sencha',

    launch: function() {
        Ext.create("Ext.tab.Panel", {
            fullscreen: true,
            tabBarPosition: 'bottom',

            items: [
                {
                    title: 'Contact',
                    iconCls: 'user',
                    xtype: 'formpanel',// 这次建立的是form panel
                    url: 'contact.php',// 提交的action地址是contact.php。我们没有这个文件,所以,就不要提交了。
                    layout: 'vbox',

                    items: [// 这里,我们有两个成员
                        {// 第一个成员是fieldset,将一些form元素包装起来。
                            xtype: 'fieldset',
                            title: 'Contact Us',
                            instructions: '(email address is optional)',
                            items: [
                                {
                                    xtype: 'textfield',// input text
                                    label: 'Name'
                                },
                                {
                                    xtype: 'emailfield',// input email,html5添加进来的新成员
                                    label: 'Email'
                                },
                                {
                                    xtype: 'textareafield',// textarea
                                    label: 'Message'
                                }
                            ]
                        },
                        {// 第二个成员,按钮
                            xtype: 'button',
                            text: 'Send',
                            ui: 'confirm',
                            handler: function() {
                                this.up('formpanel').submit();// 处理点击事件的方法
                            }
                        }
                    ]
                }
            ]
        });
    }
});


然后,上图看真相:

 

 

4.合并。

三个栏目四个页面大家都建立过了,也体验过效果。可是,我们不是做一个app吗?这样怎么算一个。好了,现在我们将它们合并起来。

 

  1. Ext.application({  
  2.     name: 'Sencha',  
  3.   
  4.     launch: function() {  
  5.         Ext.create("Ext.tab.Panel", {  
  6.             fullscreen: true,  
  7.             tabBarPosition: 'bottom',  
  8.   
  9.             items: [// 这次,我们将三个栏目当成三个Tab Panel的成员   
  10.                 {// 第一个成员,home页面   
  11.                     title: 'Home',  
  12.                     iconCls: 'home',  
  13.                     cls: 'home',  
  14.                     html: [  
  15.                         '<img width="65%" src="http://staging.sencha.com/img/sencha.png" />',  
  16.                         '<h1>Welcome to Sencha Touch</h1>',  
  17.                         "<p>You're creating the Getting Started app. This demonstrates how ",  
  18.                         "to use tabs, lists and forms to create a simple app</p>",  
  19.                         '<h2>Sencha Touch 2</h2>'  
  20.                     ].join("")  
  21.                 },  
  22.                 {// 第二个成员,blog页面   
  23.                     xtype: 'nestedlist',  
  24.                     title: 'Blog',  
  25.                     iconCls: 'star',  
  26.                     displayField: 'title',  
  27.   
  28.                     store: {  
  29.                         type: 'tree',  
  30.   
  31.                         fields: [  
  32.                             'title', 'link', 'author', 'contentSnippet', 'content',  
  33.                             {name: 'leaf', defaultValue: true}  
  34.                         ],  
  35.   
  36.                         root: {  
  37.                             leaf: false  
  38.                         },  
  39.   
  40.                         proxy: {  
  41.                             type: 'jsonp',  
  42.                             url: 'https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://feeds.feedburner.com/SenchaBlog',  
  43.                             reader: {  
  44.                                 type: 'json',  
  45.                                 rootProperty: 'responseData.feed.entries'  
  46.                             }  
  47.                         }  
  48.                     },  
  49.   
  50.                     detailCard: {  
  51.                         xtype: 'panel',  
  52.                         scrollable: true,  
  53.                         styleHtmlContent: true  
  54.                     },  
  55.   
  56.                     listeners: {  
  57.                         itemtap: function(nestedList, list, index, element, post) {  
  58.                             this.getDetailCard().setHtml(post.get('content'));  
  59.                         }  
  60.                     }  
  61.                 },  
  62.                 {// 第三个成员,Contact页面   
  63.                     title: 'Contact',  
  64.                     iconCls: 'user',  
  65.                     xtype: 'formpanel',  
  66.                     url: 'contact.php',  
  67.                     layout: 'vbox',  
  68.   
  69.                     items: [  
  70.                         {  
  71.                             xtype: 'fieldset',  
  72.                             title: 'Contact Us',  
  73.                             instructions: '(email address is optional)',  
  74.                             items: [  
  75.                                 {  
  76.                                     xtype: 'textfield',  
  77.                                     label: 'Name'  
  78.                                 },  
  79.                                 {  
  80.                                     xtype: 'emailfield',  
  81.                                     label: 'Email'  
  82.                                 },  
  83.                                 {  
  84.                                     xtype: 'textareafield',  
  85.                                     label: 'Message'  
  86.                                 }  
  87.                             ]  
  88.                         },  
  89.                         {  
  90.                             xtype: 'button',  
  91.                             text: 'Send',  
  92.                             ui: 'confirm',  
  93.                             handler: function() {  
  94.                                 this.up('formpanel').submit();  
  95.                             }  
  96.                         }  
  97.                     ]  
  98.                 }  
  99.             ]  
  100.         });  
  101.     }  
  102. });  
Ext.application({
    name: 'Sencha',

    launch: function() {
        Ext.create("Ext.tab.Panel", {
            fullscreen: true,
            tabBarPosition: 'bottom',

            items: [// 这次,我们将三个栏目当成三个Tab Panel的成员
                {// 第一个成员,home页面
                    title: 'Home',
                    iconCls: 'home',
                    cls: 'home',
                    html: [
                        '<img width="65%" src="http://staging.sencha.com/img/sencha.png" />',
                        '<h1>Welcome to Sencha Touch</h1>',
                        "<p>You're creating the Getting Started app. This demonstrates how ",
                        "to use tabs, lists and forms to create a simple app</p>",
                        '<h2>Sencha Touch 2</h2>'
                    ].join("")
                },
                {// 第二个成员,blog页面
                    xtype: 'nestedlist',
                    title: 'Blog',
                    iconCls: 'star',
                    displayField: 'title',

                    store: {
                        type: 'tree',

                        fields: [
                            'title', 'link', 'author', 'contentSnippet', 'content',
                            {name: 'leaf', defaultValue: true}
                        ],

                        root: {
                            leaf: false
                        },

                        proxy: {
                            type: 'jsonp',
                            url: 'https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http://feeds.feedburner.com/SenchaBlog',
                            reader: {
                                type: 'json',
                                rootProperty: 'responseData.feed.entries'
                            }
                        }
                    },

                    detailCard: {
                        xtype: 'panel',
                        scrollable: true,
                        styleHtmlContent: true
                    },

                    listeners: {
                        itemtap: function(nestedList, list, index, element, post) {
                            this.getDetailCard().setHtml(post.get('content'));
                        }
                    }
                },
                {// 第三个成员,Contact页面
                    title: 'Contact',
                    iconCls: 'user',
                    xtype: 'formpanel',
                    url: 'contact.php',
                    layout: 'vbox',

                    items: [
                        {
                            xtype: 'fieldset',
                            title: 'Contact Us',
                            instructions: '(email address is optional)',
                            items: [
                                {
                                    xtype: 'textfield',
                                    label: 'Name'
                                },
                                {
                                    xtype: 'emailfield',
                                    label: 'Email'
                                },
                                {
                                    xtype: 'textareafield',
                                    label: 'Message'
                                }
                            ]
                        },
                        {
                            xtype: 'button',
                            text: 'Send',
                            ui: 'confirm',
                            handler: function() {
                                this.up('formpanel').submit();
                            }
                        }
                    ]
                }
            ]
        });
    }
});


赶快把程序跑起来,查看一下图果吧。看是不是和下图一样?

 

 

这样,我们很快就建立了一个基于HTML5的 Web App了。是不是很简单?我们甚至可以用PhoneGap将它打包成 android或者iOS应用,发布到各自的应用商店去。至于PhoneGap,不在我们的讨论范围,在这里就不再详谈了。这次就介绍到这里。之后,我会给大家介绍Sencha Touch 2的详细内容。

posted @ 2014-08-24 11:28  星火卓越  阅读(2950)  评论(0编辑  收藏  举报