第一步 使用sencha touch cmd 4.0 創建項目、打包(加入全局變量、公用類、自定義擴展、資源文件)


參考資料:

http://www.cnblogs.com/qqloving/archive/2013/04/25/3043606.html

http://www.admin10000.com/document/140.html

這里我主要講的是如何加入全局變量、公用類、自定義擴展、資源文件

官網地址:http://www.sencha.com/products/touch/

官當最新doc:http://docs.sencha.com/touch/

 

1.環境搭建

  a.安裝java

    先下載JAVA,下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

    安裝到指定路徑,例如F:\Java

    打開計算機屬性——高級系統設置——環境變量(如上文)

    配置環境變量        

      變量: JAVA_HOME          值: 安裝路徑:F:\Java\jdk1.6.0_10

      變量: Path                添加值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

      變量: CLASSPATH     添加值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar  

    JAVA配置完成,接下來驗證配置是否成功。

    擊運行——輸入cmd——回車——輸入javac——回車,,如果出現一堆英文,如下圖所示,即表示配置成功。

  b.安裝cmd

    再下載 sencha touch 的sdk (一個js壓縮包),現在最新的版本為2.3,我用的2.2.1版本

    下載地址:http://www.sencha.com/products/touch/download/

    然后下載 sencha touch cmd,一個工具,主要用來創建項目、生成測試包、部署包等,我用的4.0版本

    下載地址:http://www.sencha.com/products/sencha-cmd/download/

  c.安裝ruby

    用 sencha touch cmd 生成測試包或部署包時調用的命令需要ruby,主要用來做js和css壓縮

    下載地址:http://rubyinstaller.org/  (ps:需要下載1.93的版本,不要下載2.0的版本)

    安裝過程出現如下界面。如圖

    

    有3個選項分別是:(1) 是否安裝tclTk支持。(2) 添加ruby命令路徑到系統環境變量PATH。(3)是否將 .rb 和.rbw 文件關聯到Ruby。

    這里選擇第二項即可

    安裝之后 測試cmd 是否安裝成功

    運行-》cmd ;輸入sencha,看到下面的就說明cmd安裝好了

    

    檢測當前cmd版本

    sencha upgrade --check

    更新cmd

    sencha upgrade

    如果你想升級到測試版

    sencha upgrade --check --beta

    sencha upgrade --beta

2.創建項目:

在cmd中輸入以下命令
sencha -sdk D:\ASPX\touch-2.2.1 generate app app D:\ASPX\Test

D:\ASPX\touch-2.2.1:你選擇的sdk根目錄

app D:\ASPX\Test:在指定目錄創建一個項目,命名空間為app

在谷歌瀏覽器中可以直接運行,不必搭建服務器。

如果開發過程中涉及到跨域問題,可以如下處理

找到谷歌瀏覽器,為其創建一個快捷方式,加入以下命令。--disable-web-security

關閉所有已經打開的谷歌瀏覽器,然后用你創建的快捷方式再次打開

把項目中index.html文件拖入即可。

 

3.加入全局變量以及公用類js

這是一個簡略的開發環境

如圖在app文件夾中加入config.js(全局變量),util.js(公用類)

他們的代碼分別如下

 1 /*
 2 *所有配置信息
 3 */
 4 Ext.define('app.config', {
 5     alternateClassName: 'config', //設置別名是為了方便調用,這樣直接config.weather就能獲取到變量。
 6     statics: {
 7         //天氣預報接口
 8         weather: 'http://www.weather.com.cn/data/cityinfo/101210904.html',
 9         //博客園
10         Cnblogs: 'http://www.cnblogs.com/mlzs/rss'
11     }
12 });
  1 /*公共類*/
  2 Ext.define('app.util', {
  3     alternateClassName: 'util',
  4     statics: {
  5         //加載stroe
  6         storeLoad: function(id) {
  7             var store = Ext.getStore(id);
  8             if (store.getCount() < 1) {
  9                 store.load();
 10             }
 11         },
 12         //Viewport添加新項,Viewport之中始終只有一項
 13         ePush: function(xtype) {
 14             var me = Ext.Viewport,
 15             view = me.getActiveItem();
 16             if (view && view.getItemId() == xtype) {
 17                 return;
 18             }
 19             view = Ext.create(xtype, {
 20                 itemId: xtype
 21             });
 22             //切換
 23             me.animateActiveItem(view, {
 24                 type: 'slide',
 25                 direction: 'left'
 26             });
 27         },
 28         //監控Viewport界面切換,切換時銷毀舊項
 29         eActiveitemchange: function() {
 30             var me = Ext.Viewport;
 31             me.onAfter('activeitemchange',
 32             function(t, value, oldValue, eOpts) {
 33                 if (oldValue) {
 34                     //強制銷毀,防止銷毀不完全引發錯誤
 35                     me.remove(oldValue, true);
 36                 }
 37             });
 38         },
 39         /*為Ext.Viewport添加一個消息提示組件*/
 40         addMessage: function() {
 41             Ext.Viewport.setMasked({
 42                 xtype: 'loadmask',
 43                 cls: 'message',
 44                 transparent: true,
 45                 indicator: false
 46             });
 47             this.hideMessage();
 48         },
 49         /*顯示一個消息提示*/
 50         showMessage: function(mes, autoHide) {
 51             var me = this,
 52             message = this.getMessage();
 53             message.setMessage(mes);
 54             message.show();
 55             //是否自動關閉提示
 56             if (autoHide) {
 57                 setTimeout(function() {
 58                     message.hide();
 59                 },
 60                 500);
 61             }
 62         },
 63         /*隱藏消息提示*/
 64         hideMessage: function() {
 65             this.getMessage().hide();
 66         },
 67         //消息組件
 68         getMessage: function() {
 69             return Ext.Viewport.getMasked();
 70         },
 71         //重寫ajax
 72         overrideAjax: function() {
 73             var me = this;
 74             //開始加載
 75             Ext.Ajax.on('beforerequest',
 76             function(connection, options) {
 77                 if (!options.hidMessage) {
 78                     me.showMessage('正在努力加載中...');
 79                 }
 80             });
 81             //加載成功
 82             Ext.Ajax.on('requestcomplete',
 83             function(connection, options) {
 84                 me.hideMessage();
 85             });
 86             //加載失敗
 87             Ext.Ajax.on('requestexception',
 88             function(connection, options) {
 89                 if (!options.hidMessage) {
 90                     me.showMessage('加載失敗,請稍后再試...', true);
 91                 }
 92             });
 93         },
 94         //重寫list
 95         overrideList: function() {
 96             //重寫分頁插件
 97             Ext.define("Ext.zh.plugin.ListPaging", {
 98                 override: "Ext.plugin.ListPaging",
 99                 config: {
100                     //自動加載
101                     autoPaging: true,
102                     //滾動到最底部時是否自動加載下一頁數據
103                     noMoreRecordsText: '沒有更多內容了',
104                     loadMoreText: '加載更多...' //加載更多按鈕顯示內容
105                 }
106             });
107             //重寫List
108             Ext.define("Ext.zh.List", {
109                 override: "Ext.List",
110                 config: {
111                     //取消選擇效果
112                     selectedCls: '',
113                     //禁用加載遮罩,防止跳轉時頁面卡頓,使用統一的遮罩效果
114                     loadingText: false,
115                     emptyText: '沒有更多內容了'
116                 }
117             });
118         },
119         //app初始化執行
120         inIt: function() {
121             this.eActiveitemchange();
122             this.overrideList();
123             this.overrideAjax();
124             this.addMessage();
125         }
126     }
127 });

直接utli.inIt();

config.weather就可以直接使用

創建一個ux文件夾,里面放置擴展插件。例如:

 1 /*
 2 *模仿tabpanel導航欄
 3 */
 4 Ext.define('ux.TabBar', {
 5     alternateClassName: 'tabBar',
 6     extend: 'Ext.Toolbar',
 7     xtype: 'tabBar',
 8     config: {
 9         docked: 'bottom',
10         cls: 'navToolbar',
11         layout: {
12             align: 'stretch'
13         },
14         defaults: {
15             flex: 1
16         },
17         //被選中的按鈕
18         selectButton: null
19     },
20     initialize: function () {
21         var me = this;
22         me.callParent();
23         //監聽按鈕點擊事件
24         me.on({
25             delegate: '> button',
26             scope: me,
27             tap: 'onButtonTap'
28         });
29     },
30     //更新被選中按鈕
31     updateSelectButton: function (newItem, oldItem) {
32         if (oldItem) {
33             oldItem.removeCls('x-tabBar-pressing');
34         }
35         if (newItem) {
36             newItem.addCls('x-tabBar-pressing');
37         }
38     },
39     //當按鈕被點擊時
40     onButtonTap: function (button) {
41         if (!button.getInitialConfig('noSelect')) {
42             this.setSelectButton(button);
43         }
44     },
45     /**
46     * @private 
47     *執行添加項,調用add方法后自動執行
48     */
49     onItemAdd: function (item, index) {
50         if (!this.getSelectButton() && item.getInitialConfig('selected')) {
51             this.setSelectButton(item);
52         }
53         this.callParent(arguments);
54     }
55 });

在app.js中需要加入

 1 //指定ux起調目錄
 2 Ext.Loader.setPath({
 3     'ux': 'app/ux'
 4 });
 5 //簡略寫法
 6 Ext.application({
 7     name: 'app',
 8     appFolder: 'app',
 9     controllers: ['Main', 'Panel', 'Layout', 'List'],
10     requires: ['app.config', 'app.util'],
11     launch: function () {
12         util.inIt();
13     }
14 });

這樣就可以通過ux.TabBar來使用自定義控件了

例如:

 1 Ext.define('app.view.MyBar', {
 2     alternateClassName: 'myBar',
 3     extend: 'ux.TabBar',
 4     xtype: 'myBar',
 5     requires: ['app.view.About'],
 6     config: {
 7         items: [
 8         {
 9             xtype: 'button',
10             text: '首頁',
11             //只有第一個設置的屬性有效
12             selected: true,
13             action: 'redirect',
14             redirect: 'home'
15         },
16         {
17             xtype: 'button',
18             text: '關於',
19             action: 'redirect',
20             redirect: 'about'
21         },
22         {
23             xtype: 'button',
24             text: '其他',
25             //沒有選中效果
26             noSelect:true,
27             action: 'other'
28         }]
29     }
30 });

 

下面是資源文件的引入

在app.json文件中:

通過resources來配置資源文件,這樣使用cmd打包時才會將資源文件復制到生成的項目中

下面是我的app.json,其中有我對各個配置的理解

  1 {
  2     /**
  3      * 項目的命名空間
  4      */
  5     "name": "app",
  6     /**
  7      * 項目起始html文件,路徑相對於此app.json文件
  8      */
  9     "indexHtmlPath": "index.html",
 10     /**
 11      * 運行此項目的url路徑,比如: "http://localhost/myapp/index.html".
 12      *
 13      *當設置此值時,將不能通過文件系統直接訪問。
 14      */
 15     "url": null,
 16     /**
 17      * 所需引用js文件
 18      * 單個格式如下
 19      *      {
 20      *          "path": "path/to/script.js" // 文件路徑,如果本地文件,路徑相對於此app.json文件
 21      *          "remote": true              // (可選值)
 22      *                                      // -默認值為"false"
 23      *                                      // -"true",如果這個文件是一個遠程文件不會被復制
 24      *          "update": "delta"           // (可選值)
 25      *                                      // 如果沒有指定,這個文件將只加載一次,
 26      *                                        // 緩存到localStorage里面,直到這個值被改變。
 27      *                                      //  - "delta" 增量更新此文件
 28      *                                      //  - "full" 當文件改變時,完全更新此文件
 29      *          "x-bootstrap": true         // (可選值)
 30      *                                      // 表示這是項目依賴文件。
 31      *                                      // 該文件不會被復制到生成目錄或引用
 32      *
 33      *      }
 34      */
 35     "js": [{
 36         "path": "touch/sencha-touch.js",
 37         "x-bootstrap": true
 38     },
 39     {
 40         "path": "app.js",
 41         /* 表示所有的類生成到這個文件 */
 42         "bundle": true,
 43         "update": "delta"
 44     }],
 45     /**
 46      *所需引用js文件
 47      * 單個格式如下
 48      *      {
 49      *          "path": "path/to/script.js" // 文件路徑,如果本地文件,路徑相對於此app.json文件
 50      *          "remote": true              // (可選值)
 51      *                                      // -默認值為"false"
 52      *                                      // -"true",如果這個文件是一個遠程文件不會被復制
 53      *          "update": "delta"           // (可選值)
 54      *                                      // 如果沒有指定,這個文件將只加載一次,
 55      *                                        // 緩存到localStorage里面,直到這個文件被改變。
 56      *                                      //  - "delta" 增量更新此文件
 57      *                                      //  - "full" 當文件改變時,完全更新此文件
 58      *
 59      *      }
 60      */
 61     "css": [{
 62         "path": "resources/css/app.css",
 63         "update": "delta"
 64     },
 65     {
 66         "path": "resources/css/main.css",
 67         "update": "delta"
 68     }],
 69     /**
 70      *項目生成時用於自動生成HTML5應用程序緩存清單(cache.manifest)
 71      */
 72     "appCache": {
 73         /**
 74          * 本地緩存名單
 75          */
 76         "cache": ["index.html"],
 77         /**
 78          * 網絡緩存名單
 79          */
 80         "network": ["*"],
 81         /**
 82          * FALLBACK緩存名單
 83          */
 84         "fallback": []
 85     },
 86     /**
 87      * 項目生成時需要復制的資源文件
 88      */
 89     "resources": ["resources/images", "resources/icons", "resources/startup"],
 90     /**
 91      * 項目生成時忽略的文件/目錄名稱匹配,必須是有效的正則表達式
 92      */
 93     "ignore": ["\.svn$"],
 94     /**
 95      * 之前生成項目儲存目錄,用於進行增量更新,不可隨意改變此目錄下的文件
 96      */
 97     "archivePath": "archive",
 98     /**
 99      * 在cmd創建時需要引用的類
100      */
101     "requires": [],
102     /**
103      * 唯一ID,作為localStorage前綴。
104      * 通常情況下,你不應該改變這個值。
105      */
106     "id": "d8504e05-a9fc-4692-bdbc-94c3190751f5"
107 }

 

4.通過cmd生成項目

運行命令行工具,進入你的項目目錄

運行cmd生成命令:

sencha app build native:直接打包成本地蘋果或者安卓應用,具體參見http://www.cnblogs.com/mlzs/p/3470224.html

sencha app build production:生成web包,主要用於發布web版本

sencha app build package:生成壓縮包

sencha app build testing:生成測試包

生成過程中,有錯誤請根據提示進行排錯

如上生成成功

示例demo可以看這里:http://www.cnblogs.com/mlzs/p/3382229.html

此項目為了開發方便對結構進行了簡化,使用cmd生成一個命名空間為app的項目,將demo項目中的文件復制到對應app項目目錄中,使用cmd打包成功(已測)

項目build目錄下可以找到生成之后的項目

類似下圖:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM