Extjs學習筆記 --- 實戰

          Posted on 2008-01-12 13:27 久城 閱讀(17295) 評論(10)  編輯  收藏 所屬分類: EXT&Extjs
          閑了將近二十天,一直在學習Extjs,昨天接到通知,下周將進入新的項目組培訓,培訓內容是Flex。

          在學Extjs的時候,見過別人對Extjs和Flex的比較。記得當時有人說Extjs和Flex根本不是一個層次上的框架,但那時我依然連Flex是什么都沒有去查,而毅然的選擇了Extjs。但可笑的是,下一個項目的應用就是Flex。

          由于項目的緊張,也許對Extjs的學習將要告一段落了。所以,我該寫點什么。

          用Extjs做登錄

          index.html
          <div id="north-div"><id="login" href="#">Login</a></div>

          login.js
          Ext.onReady(function() {
              Ext.BLANK_IMAGE_URL 
          = '../../ext/resources/images/default/s.gif'; //替換默認的空白圖片
              Ext.QuickTips.init();  // 初始化鼠標停留時的顯示框,這里用不上
              // 點擊登錄時觸發的事件
              onClickLogin = function() {
                  
          var loginUrl = '../../login.do'; // 登錄請求的url
                  // 這里Login的Panel分為兩部分,logoPanel和formPanel
                  // 創建logoPanel對象
                  var logoPanel = new Ext.Panel( {
                      baseCls : 'x
          -plain',
                      html : 'Here is your logo'
                  });
                  
          // 創建formPanel對象
                  var formPanel = new Ext.form.FormPanel( {
                      bodyStyle : 'padding:35px 25px 
          0',
                      baseCls : 'x
          -plain',
                      defaults : {
                          width : 
          200
                      },
                      defaultType : 'textfield',
                      frame : 
          false,
                      id : 'login
          -form',
                      
          // form面板上的組件
                      items : [ {
                          fieldLabel : 'User Name',
                          name : 'name'
                      }, {
                          fieldLabel : 'Password',
                          inputType : 'password',
                          name : 'password'
                      }],
                      labelWidth : 
          120,
                      region : 'center',
                      url : loginUrl
                  });
                  
          // 創建window對象,用來裝置以上兩個面板,使login顯示在一個window上
                  var win = new Ext.Window( {
                      
          // window上的按鈕,按鈕時獨立的,也可以設置在formPanel里
                      buttons : [ {
                          handler : 
          function() { // 按鈕login觸發的事件
                              form.submit( {
                                  waitMsg : 'Please Wait',
                                  reset : 
          true,
                                  success : 
          this.Success, // 登錄成功的時候執行
                                  fail : this.Fail,  // 登錄失敗的時候執行
                                  scope : onClickLogin // 這里是為了指定this的范圍
                              });
                          },
                          scope : onClickLogin,
                          text : 'LOGIN'
                      }, {
                          handler : 
          function() { // 按鈕cancel觸發的事件
                              win.hide();
                          },
                          scope : onClickLogin,
                          text : 'CANCEL'
                      }],
                      buttonAlign : 'right',
                      closable : 
          false,
                      draggable : 
          true,
                      height : 
          200,
                      id : 'login
          -win',
                      layout : 'border',
                      plain : 
          true,
                      
          // window上的組件
                      items : [logoPanel, formPanel],
                      title : 'Login',
                      width : 
          400
                  });
                  
          // 取得表單,參考login按鈕觸發的事件
                  form = formPanel.getForm();

                  
          // 顯示window
                  win.show();

                  
          // return里的為onClickLogin的共有函數
                  return {
                      Success : 
          function(f, a) {
                          
          if (a && a.result) { //a表示action,a.result表示action返回的結果數據
                              win.destroy(
          true);
                              
          // setCookie
                              // set window.location
                          }
                      },
                      Fail : 
          function(f, a) {
                          Ext.Msg.alert('Login failed');
                      }
                  };
              };
              
          // 設置login事件
              Ext.get('login').on('click', onClickLogin);
          });

          Extjs是與后臺對立的框架,所以后臺的處理用什么是隨意的,只要能夠返回前臺可以識別的數據即可。

          用Extjs做布局

          js代碼片段:
          Ext.contants = {};
          Ext.contants.links 
          = '<a id="link1" href="#">Link1</a><br><a id="link2" href="#">Link2</a>'
          // 創建一個TabPanel作為中間的面板
          var centerPanel = new Ext.TabPanel( {
              region : 'center',
              contentEl : 'center
          -div',
              split : 
          true,
              border : 
          true,
              resizeTabs : 
          true,
              minTabWidth : 
          115,
              tabWidth : 
          135,
              enableTabScroll : 
          true,
              defaults : {
                  autoScroll : 
          true
              },
              plugins : 
          new Ext.ux.TabCloseMenu()
          });
          // 用Viewport來實現布局
          var viewport = new Ext.Viewport( {
              layout : 'border',
              
          // items中包含東西南北中五個組件
              items : [ {
                  
          // 我將北部設計為全局導航,比如可以把login的按鈕放在這里
                  title : 'Welcome to come China',
                  region : 'north',
                  contentEl : 'north
          -div',
                  split : 
          true,
                  border : 
          true,
                  collapsible : 
          true,
                  height : 
          50,
                  minSize : 
          50,
                  maxSize : 
          120
              }, {
                  
          // 空面板
                  region : 'south',
                  contentEl : 'south
          -div',
                  split : 
          true,
                  border : 
          true,
                  collapsible : 
          true,
                  height : 
          50,
                  minSize : 
          50,
                  maxSize : 
          120
              }, {
                  
          // 空面板
                  region : 'east',
                  contentEl : 'east
          -div',
                  split : 
          true,
                  border : 
          true,
                  collapsible : 
          true,
                  width : 
          120,
                  minSize : 
          120,
                  maxSize : 
          200
              }, {
                  
          // Links面板
                  title : 'Links',
                  region : 'west',
                  contentEl : 'west
          -div',
                  split : 
          true,
                  border : 
          true,
                  collapsible : 
          true,
                  width : 
          150,
                  minSize : 
          120,
                  maxSize : 
          200,
                  layout : 'accordion',
                  layoutConfig : {
                      animate : 
          true
                  },
                  
          // 面板中包含幾個組件
                  items : [ {
                      
          // 以其中一個為例,這里面有兩個links
                      html : Ext.contants.links,
                      title : 'Links',
                      autoScroll : 
          true,
                      border : 
          false,
                      iconCls : 'nav'
                  }, {
                      title : 'aaa',
                      html : 'aaa',
                      border : 
          false,
                      autoScroll : 
          true,
                      iconCls : 'settings'
                  }, {
                      title : 'bbb',
                      html : 'bbb',
                      border : 
          false,
                      autoScroll : 
          true,
                      iconCls : 'settings'
                  }, {
                      title : 'bbb',
                      html : 'ccc',
                      border : 
          false,
                      autoScroll : 
          true,
                      iconCls : 'settings'
                  }, {
                      title : 'bb',
                      html : 'ddd',
                      border : 
          false,
                      autoScroll : 
          true,
                      iconCls : 'settings'
                  }, {
                      title : 'bbb',
                      html : 'eee',
                      border : 
          false,
                      autoScroll : 
          true,
                      iconCls : 'settings'
                  }]
              }, centerPanel] 
          //最后一個是中間的TabPanel
          });

          用事件來觸發centerPanel中添加一個裝有GridPanel的Tab,顯示新聞列表,TabPanel中添加一個按鈕實現添加新聞。
          var zhaiiGrid;
          // 在TabPanel中的Add按鈕觸發的事件,用來添加一條新信息
          var addZhaii = function() {
              
          var formPanel, win;
              
          if (!formPanel) {
                  formPanel 
          = new Ext.form.FormPanel( {
                      baseCls : 'x
          -plain',
                      defaults : {
                          width : 
          200
                      },
                      defaultType : 'textfield',
                      frame : 
          false,
                      id : 'addZhaii
          -form',
                      items : [ {
                          fieldLabel : 'Title',
                          name : 'title'
                      }, {
                          fieldLabel : 'Contents',
                          xtype : 'htmleditor',
                          anchor : '
          95%',
                          allowBlank : 
          false,
                          height : 
          200,
                          name : 'contents'
                      }],
                      labelWidth : 
          80,
                      region : 'center',
                      url : 'addZhaii.
          do'
                  });
              }

              
          if (!win) {
                  win 
          = new Ext.Window( {
                      buttons : [ {
                          handler : 
          function() {
                              form.submit( {
                                  waitMsg : 'Please Wait',
                                  reset : 
          true,
                                  
          // success : Login.Success,
                                      scope : addZhaii
                                  });
                          },
                          scope : addZhaii,
                          text : 'Add'
                      }, {
                          handler : 
          function() {
                              win.hide();
                          },
                          scope : addZhaii,
                          text : 'Cancel'
                      }],
                      buttonAlign : 'right',
                      closable : 
          false,
                      draggable : 
          true,
                      height : 
          300,
                      id : 'addZhaii
          -win',
                      layout : 'border',
                      minHeight : 
          250,
                      minWidth : 
          530,
                      plain : 
          true,
                      resizable : 
          true,
                      items : [formPanel],
                      title : 'Link1 Window',
                      width : 
          650
                  });
              }

              form 
          = formPanel.getForm();

              win.show();
          };
          var addZhaiiAction = new Ext.Action( {
              text : 'Add Zhaii',
              handler : addZhaii, 
          // 觸發上面定義的添加事件
              iconCls : 'blist'
          });
          var addZhaiiTab = function() {
              
          var expander = new Ext.grid.RowExpander( {
                  tpl : 
          new Ext.Template('<p><b>Title:</b> {title}<br>',
                          '
          <p><b>Contents:</b> {contents}</p>')
              });
              
          var cm = new Ext.grid.ColumnModel([expander, {
                  header : 'id',
                  dataIndex : 'id'
              }, {
                  header : 'title',
                  width : 
          300,
                  dataIndex : 'title'
              }, {
                  header : 'zhaier',
                  dataIndex : 'zhaier'
              }, {
                  header : 'date',
                  dataIndex : 'date'
              }, {
                  header : 'sc',
                  dataIndex : 'sc'
              }, {
                  header : 'hh',
                  dataIndex : 'hh'
              }]);
              
          var ds = new Ext.data.Store( {
                  proxy : 
          new Ext.data.HttpProxy( {
                      url : '..
          /../getZhaii.do'
                  }),
                  reader : 
          new Ext.data.JsonReader( {
                      totalProperty : 'totalProperty',
                      root : 'root'
                  }, [ {
                      name : 'content'
                  }, {
                      name : 'hh'
                  }, {
                      name : 'sc'
                  }, {
                      name : 'date'
                  }, {
                      name : 'zhaier'
                  }, {
                      name : 'title'
                  }, {
                      name : 'id'
                  }])
              });
              ds.load( {
                  params : {
                      start : 
          0,
                      limit : 
          10
                  }
              });
              
          if (Ext.isEmpty(zhaiiGrid)) {
                  zhaiiGrid 
          = new Ext.grid.GridPanel( {
                      store : ds,
                      cm : cm,
                      id : 'zhaiiGrid',
                      viewConfig : {
                          forceFit : 
          true
                      },
                      plugins : expander,
                      collapsible : 
          true,
                      animCollapse : 
          false,
                      title : 'zhaiiGrid',
                      iconCls : 'icon
          -grid',
                      closable : 
          true,
                      
          // top處添加事件按鈕
                      tbar : [addZhaiiAction],
                      
          // bottom處的分頁欄
                      bbar : new Ext.PagingToolbar( {
                          pageSize : 
          10,
                          store : ds,
                          displayInfo : 
          true,
                          displayMsg: '顯示第 {
          0} 條到 {1} 條記錄,一共 {2} 條',
                          emptyMsg: '沒有記錄'
                      })
                  });
                  
          // .show()了才會顯示
                  centerPanel.add(zhaiiGrid).show();
              } 
          else if (zhaiiGrid = centerPanel.getItem('zhaiiGrid')) {
                  
          // zhaiiGrid.show();
              } else {
                  zhaiiGrid 
          = new Ext.grid.GridPanel( {
                      store : ds,
                      cm : cm,
                      id : 'zhaiiGrid',
                      viewConfig : {
                          forceFit : 
          true
                      },
                      plugins : expander,
                      collapsible : 
          true,
                      animCollapse : 
          false,
                      title : 'adsfasd',
                      iconCls : 'icon
          -grid',
                      closable : 
          true,
                      tbar : [addZhaiiAction],
                      bbar : 
          new Ext.PagingToolbar( {
                          pageSize : 
          10,
                          store : ds,
                          displayInfo : 
          true,
                          displayMsg: '顯示第 {
          0} 條到 {1} 條記錄,一共 {2} 條',
                          emptyMsg: '沒有記錄'
                      })
                  });
                  centerPanel.add(zhaiiGrid).show();
              }
          }
          // 給link1添加事件
          Ext.get('link1').on('click', addZhaiiTab);
          // 初始化頁面時,便添加zhaiiTab
          addZhaiiTab();

          以上是一些代碼片斷,前幾天在研究desktop,想實現成動態的頁面,代碼還沒寫完。

          暫時放下Extjs一些日子,明天開始學習Flex,既然都是客戶端框架,應該多少有些共通之處吧。誰知道呢,學學看吧。

          本文鏈接:http://www.aygfsteel.com/realsmy/archive/2008/01/12/174791.html



          歡迎來訪!^.^!
          本BLOG僅用于個人學習交流!
          目的在于記錄個人成長.
          所有文字均屬于個人理解.
          如有錯誤,望多多指教!不勝感激!

          Feedback

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2008-01-13 01:43 by 咖啡屋的鼠標
          哈哈,我是今天剛看完ext,成長歷程跟你完全相反。把你的extjs換成Flex,把Flex換成Extjs就是我的心態。
          ext確實很酷,目前最酷的客戶端類庫了。
          而Flex跟ext分屬兩種不同世界的玩具,玩玩就知道了,順便給你推薦一個Flex控件庫:
          http://code.google.com/p/flexlib/wiki/ComponentList

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2008-01-13 10:07 by 久城
          哈哈,多謝!~以后向你請教Flex!

          # re: Extjs學習筆記 --- 實戰[未登錄]  回復  更多評論   

          2008-01-14 13:03 by 過客
          腳本引擎的效率不同,所以不管extjs有多么強大,它都不會比flex更好,何況flex可以用N多flash內置的同時js不具有的組件。

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2008-01-17 11:39 by wangdei
          http://www.yaonba.com/content.php?id=108177 這個也有exips的.

          # re: Extjs學習筆記 --- 實戰[未登錄]  回復  更多評論   

          2008-01-23 14:57 by left
          先謝謝阿 學習下

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2008-07-24 19:08 by dafei
          學習

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2008-09-22 17:09 by 王杰
          能不能提供個聯系方式啊
          或者交流平臺
          不知你現在flex 的項目做完沒?

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2009-02-03 18:31 by longfengabc
          @過客
          體積呢?Flex 體積和ExtJS是沒法比的

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2009-02-11 10:42 by dalton
          瀏覽器的相互不兼容性以及萬惡的IE都在制約JS的發展

          # re: Extjs學習筆記 --- 實戰  回復  更多評論   

          2009-04-10 16:59 by taoyang
          很想學flex 學習中

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          Copyright © 久城

          主站蜘蛛池模板: 玉田县| 西藏| 安平县| 瑞昌市| 温泉县| 临江市| 静乐县| 桐庐县| 罗定市| 蒲江县| 唐河县| 绍兴市| 溧阳市| 通道| 合水县| 凉城县| 天祝| 长汀县| 华宁县| 沈丘县| 马公市| 友谊县| 华阴市| 托克托县| 色达县| 都兰县| 藁城市| 石楼县| 集贤县| 河南省| 彭州市| 宽甸| 阳曲县| 平湖市| 阳高县| 太谷县| 商南县| 穆棱市| 东乡县| 大名县| 临潭县|