白日不到處,青春恰自來。
          苔花如米小,亦學牡丹開。
          posts - 4,  comments - 34,  trackbacks - 0
                最近接觸yui-ext,被它漂亮的界面征服,于是想把它運用到項目里面。
          公司目前是用dwr來實現一些簡單的ajax功能,想把yui-ext結合dwr,但目前網上還很少有這樣的例子,參考了yui-ext論壇里面的文章,做了一個簡單的分頁例子(下載)
              dwrproxy.js,這里只需要修改很少的地方。   
          Ext.data.DWRProxy = function(dwrCall, pagingAndSort){
            Ext.data.DWRProxy.superclass.constructor.call(
          this);
            
          this.dwrCall = dwrCall;
            
          //this.args = args;
              this.pagingAndSort = (pagingAndSort!=undefined ? pagingAndSort : true);
          }
          ;

          Ext.extend(Ext.data.DWRProxy, Ext.data.DataProxy, 
          {
            load : function(params, reader, callback, scope, arg) 
          {
              
          if(this.fireEvent("beforeload"this, params) !== false{
                var sort;
                
          if(params.sort && params.dir) sort = params.sort + ' ' + params.dir;
                
          else sort = '';
                var delegate 
          = this.loadResponse.createDelegate(this, [reader, callback, scope, arg], 1);
                var callParams 
          = new Array();
              
                  
                      
          //if(this.pagingAndSort) {
                    
          //callParams.push(params.start);
                    
          //callParams.push(params.limit);
                    
          //callParams.push(sort);
                      
          //}

                
          //這里的arg.params包含了分頁時用到的基礎參數和用戶查詢時自定義的參數    
                callParams.push(arg.params);
                callParams.push(delegate);
                
               
          //console.debug(callParams);         
               
                
          this.dwrCall.apply(this, callParams);
              
              }
           else {
                callback.call(scope 
          || thisnull, arg, false);
              }

            }
          ,

            loadResponse : function(listRange, reader, callback, scope, arg) 
          {
              var result;
              
          //console.debug(listRange); 
              try {
                result 
          = reader.read(listRange);
              }
           catch(e) {
                
          this.fireEvent("loadexception"thisnull, response, e);
                callback.call(scope, 
          null, arg, false);
                
          return;
              }

              callback.call(scope, result, arg, 
          true);
            }
          ,

            update : function(dataSet)
          {},

            updateResponse : function(dataSet)
            
          {}
          }
          );

          Ext.data.ListRangeReader 
          = function(meta, recordType){
              Ext.data.ListRangeReader.superclass.constructor.call(
          this, meta, recordType);
              
          this.recordType = recordType;
          }
          ;
          Ext.extend(Ext.data.ListRangeReader, Ext.data.DataReader, 
          {
            getJsonAccessor: function()
          {
                var re 
          = /[\[\.]/;
                
          return function(expr) {
                    
          try {
                        
          return(re.test(expr))
                            
          ? new Function("obj""return obj." + expr)
                            : function(obj)
          {
                                
          return obj[expr];
                            }
          ;
                    }
           catch(e){}
                    
          return Ext.emptyFn;
                }
          ;
            }
          (),
              
              read : function(o)
          {
                  var recordType 
          = this.recordType, fields = recordType.prototype.fields;

                  
          //Generate extraction functions for the totalProperty, the root, the id, and for each field
                  if (!this.ef) {
                      
          if(this.meta.totalProperty) {
                          
          this.getTotal = this.getJsonAccessor(this.meta.totalProperty);
                      }

                  
                      
          if(this.meta.successProperty) {
                          
          this.getSuccess = this.getJsonAccessor(this.meta.successProperty);
                      }


                      
          if (this.meta.id) {
                          var g 
          = this.getJsonAccessor(this.meta.id);
                          
          this.getId = function(rec) {
                              var r 
          = g(rec);
                              
          return (r === undefined || r === ""? null : r;
                          }
          ;
                      }
           else {
                          
          this.getId = function(){return null;};
                      }

                      
          this.ef = [];
                      
          for(var i = 0; i < fields.length; i++){
                          f 
          = fields.items[i];
                          var map 
          = (f.mapping !== undefined && f.mapping !== null? f.mapping : f.name;
                          
          this.ef[i] = this.getJsonAccessor(map);
                      }

                  }


                 var records 
          = [];
                 var root 
          = o.data, c = root.length, totalRecords = c, success = true;

                 
          if(this.meta.totalProperty){
                  var v 
          = parseInt(this.getTotal(o), 10);
                      
          if(!isNaN(v)){
                          totalRecords 
          = v;
                      }

                  }


                  
          if(this.meta.successProperty){
                      var v 
          = this.getSuccess(o);
                      
          if(v === false || v === 'false'){
                          success 
          = false;
                      }

                  }


                  
          for(var i = 0; i < c; i++){
                  var n 
          = root[i];
                var values 
          = {};
                var id 
          = this.getId(n);
                
          for(var j = 0; j < fields.length; j++){
                          f 
          = fields.items[j];
                  var v 
          = this.ef[j](n);                        
                  values[f.name] 
          = f.convert((v !== undefined) ? v : f.defaultValue);
                }

                var record 
          = new recordType(values, id);
                records[i] 
          = record;
              }


              
          return {
                 success : success,
                 records : records,
                 totalRecords : totalRecords
              }
          ;
            }

          }
          );

               paging.js,分頁時的調用的寫法。
            
          /*

           * Ext JS Library 1.0.1

           * Copyright(c) 2006-2007, Ext JS, LLC.

           * licensing@extjs.com

           * 

           * 
          http://www.extjs.com/license

           
          */




          Ext.onReady(function()
          {


              var recordType 
          = Ext.data.Record.create([

                  
          {name: "id", type: "int"},

                  
          {name: "department", type: "string"},

                  
          {name: "operator", mapping:"operator.pname", type: "string"},

                  
          {name: "content", mapping:"content", type: "string"}

                ]);

                    
              
          // create the Data Store
              var ds = new Ext.data.Store({
                  
          // load using DWRProxy
                  proxy: new Ext.data.DWRProxy(MeetingService.findMeetingby, true),

                  
          // create reader that reads the Topic records
                  reader: new Ext.data.ListRangeReader({
                      totalProperty: 
          'totalSize',
                      id: 
          'id'
                  }
          , recordType),

                  
          // turn on remote sorting
                  remoteSort: true
              }
          );
              
          //ds.setDefaultSort('department', 'desc');

              
          // pluggable renders
              function renderTopic(value, p, record){
                  
          return String.format('<b>{0}</b>{1}', value, record.data['operator']);
              }

              function renderTopicPlain(value)
          {
                  
          return String.format('<b><i>{0}</i></b>', value);
              }

              function renderLast(value, p, r)
          {

                  
          return String.format('{0}<br/>by {1}', value, r.data['department']);
              }

              function renderLastPlain(value)
          {
                  
          return value;
              }


              
          // the column model has information about grid columns
              
          // dataIndex maps the column to the specific data field in
              
          // the data store
              var cm = new Ext.grid.ColumnModel([{
                     id: 
          'department'// id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
                     header: "部門",
                     dataIndex: 
          'department',
                     width: 
          150,
                     renderer: renderTopic,

                     sortable: 
          true,
                     css: 
          'white-space:normal;'
                  }
          ,{
                     header: 
          "操作人",
                     dataIndex: 
          'operator',
                     width: 
          150,

                     sortable: 
          true,
                     hidden: 
          false        //    隱藏列
                  }
          ,{
                     id: 
          'content',
                     header: 
          "內容",
                     dataIndex: 
          'content',
                     width: 
          250,

                     sortable: 
          true,
                     renderer: renderLast
                  }
          ]);

              
          // by default columns are sortable
              
          //cm.defaultSortable = true;

              
          // create the editor grid
              var grid = new Ext.grid.Grid('meeting-grid'{
                  ds: ds,
                  cm: cm,
                  selModel: 
          new Ext.grid.RowSelectionModel({singleSelect:true}),
                  enableColLock:
          false,
                  loadMask: 
          true    //是否顯示正在加載
              }
          );

              
          // make the grid resizable, do before render for better performance
              var rz = new Ext.Resizable('meeting-grid'{
                  wrap:
          true,
                  minHeight:
          100,
                  pinned:
          true,
                  handles: 
          's'
              }
          );
              rz.on(
          'resize', grid.autoSize, grid);

              
          // render it
              grid.render();

              var gridFoot 
          = grid.getView().getFooterPanel(true);

              
          // add a paging toolbar to the grid's footer
              var paging = new Ext.PagingToolbar(gridFoot, ds, {
                  pageSize: 
          5,
                  displayInfo: 
          true,
                  displayMsg: 
          '顯示 {0} - {1} of {2}',
                  emptyMsg: 
          "沒有記錄"
              }
          );
              
          // add the detailed view button
              paging.add('-'{
                  pressed: 
          true,
                  enableToggle:
          true,
                  text: 
          '詳細信息',
                  cls: 
          'x-btn-text-icon details',
                  toggleHandler: toggleDetails
              }
          );

              
          // trigger the data store load
             
          // ds.load({params:{start:0, limit:5}, extraParams:{dept:'test', viaParam:true}});        

              
          //ds.load({params:{start:0, limit:5, department:'test', viaPara:true}});    

              
          //ds.load({params:{start:0, limit:5}});    

              

              
          //查詢時需要用到的參數

              ds.on(
          'beforeload', function() {

                    ds.baseParams 
          = {

                      dept: 
          'test111',

                      viaParam: 
          true

                    }
          ;

                  }
          );    

              
          //分頁基本參數    

              ds.load(
          {params:{start:0, limit:5}});    

                  

              function toggleDetails(btn, pressed)
          {
                  cm.getColumnById(
          'department').renderer = pressed ? renderTopic : renderTopicPlain;
                  cm.getColumnById(
          'content').renderer = pressed ? renderLast : renderLastPlain;
                  grid.getView().refresh();
              }

          }
          );

            dwr調用后臺的處理方式:

          public ListRange findMeetingby(Map condition) {
                  
          // TODO Auto-generated method stub
                  int totalRecords = getContentCount();
                  HQuery hquery 
          = new HQuery();
                  hquery.setPageStartNo(Integer.parseInt(condition.get(
          "start").toString()));
                  hquery.setNumberPerPages(Integer.parseInt(condition.get(
          "limit").toString()));
                  hquery.setQueryString(
          "from Meeting as a ");
                  StringBuffer sb 
          = new StringBuffer();
                  sb.append(
          "order by ");
                  
          if(condition.get("sort"!= null && condition.get("dir"!= null){
                      sb.append(
          "a.");
                      sb.append(condition.get(
          "sort"));
                      sb.append(
          " ");
                      sb.append(condition.get(
          "dir"));
                  }
          else
                      sb.append(
          "a.lastModifiedDate desc");
                  
                  hquery.setOrderby(sb.toString());
                  List ls 
          =  this.getBaseDao().executeQuery(hquery);
                  
          return new ListRange(ls.toArray(), totalRecords);
              }

             

           

          posted on 2007-06-05 09:30 凍僵的魚 閱讀(8529) 評論(33)  編輯  收藏

          FeedBack:
          # re: 結合dwr的yui-ext分頁例子[未登錄]
          2007-06-05 13:21 | yy
          可以提供dome下載么  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-05 17:19 | 凍僵的魚
          已經加上Demo下載了  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 10:22 | 匿名
          所提供的代碼運行時報錯,TodoService未定義,錯誤是從grid.js中報出來的  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 16:14 | 凍僵的魚
          由于這里只能上傳2M附件,我把例子lib目錄里面dwr.jar和spring.jar刪掉了,你把dwr2.0.1、Spring2.0.4放進去就能運行了。
            回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 16:14 | hama
          盜版  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 16:14 | hama
          完全盜版  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 16:46 | 凍僵的魚
          我也已經說過是參考了yui-ext論壇里面的文章,但它那個例子有些問題,翻頁和排序時自定義的參數傳掉,在這基礎上做了一些改動,在IE7和FF都測試通過。  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 17:42 | 匿名
          我放了的,共放了3個jar:commons-logging-1.0.4.jar、dwr.jar、spring.jar,但出現TodoService未定義的錯誤
          to:凍僵的魚 這個代碼你運行正常?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-06 17:58 | 凍僵的魚
          代碼是測試通過的,你看下是不是DWR與tomcat有沖突了,看下tomcat日志  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-07 14:41 | 匿名
          原來是我把dwr的包弄錯了,我用的是1.1的包,換成2.0.1就正常了,謝謝  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-15 12:18 | mican
          你的那個 dwrproxy.js 是否是通用的,就是我改了一下grid.js 里的recordType,有個字段為時間類型,我是這樣設置的
          var recordType = Ext.data.Record.create([
          {name: "id", type: "int"},
          {name: "user",mapping:"aMsg.user", type: "string"},
          {name: "sayto", mapping:"aMsg.sayto", type: "string"},
          {name: "content",mapping:"aMsg.content", type: "string"},
          {name: "sendtime", mapping:"aMsg.sendtime", type: "date",dateFormat: 'timestamp'}
          ]);
          但是運行的時候他老抱這個錯:Error: TypeError, 'response' 未定義,請指點  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-15 15:17 | 凍僵的魚
          你的aMsg.sendtime是什么日期類型的?
          我測試過java.util.Date和java.sql.Timestamp都正常~~  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-15 15:57 | 解凍的魚
          我也來試試,謝謝斑竹  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-15 16:30 | 解凍的魚
          不錯,我在新公司可以借鑒。
          我以前公司的ajax界面,可以做到上邊是每條記錄的form,下邊是list列表,兩個公用一個dataset,類似dephi.我發現workshop可以實現這樣的功能,yui不知道可不可以。  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-16 13:34 | mican
          凍僵的魚 能說說ds 和cm里 的時間類型你是怎么定義的,比如我返回的數據里的時間格式是:yyyy-MM-dd hh:mm:ss  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-18 09:32 | 凍僵的魚
          to mican
          只需要在cm定義指定一個renderer就可以了
          var cm = new Ext.grid.ColumnModel(
          [

          {
          header: 'Reg Date',
          width: 150,
          sortable: true,
          renderer: Ext.util.Format.dateRenderer('Y/m/d'),
          dataIndex: 'regDate'
          }
          ]
          );  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-18 09:40 | 凍僵的魚
          to 解凍的魚
          我也在嘗試實現類似你所說的那種效果,對于yui,我也是剛接觸不久,希望有空可以多交流AJAX技術,MSN:zyh2k at msn.com。  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-22 09:57 | 解凍的魚
          我看了yui-ext的form,是store刷新的,應該可以實現我說的那種功能。
          yui-ext其實是無所不能的,還支持拖動,太牛了。  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-06-22 10:03 | 解凍的魚
          我的msn:matt_wang129@hotmail.com,多交流  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-07-12 19:20 | Harrison
          感謝大蝦的幫助先!
          我的問題:
          ReferenceError: response is not defined

          怎么回事?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-07-13 09:33 | 凍僵的魚
          to Harrison:
          在dwr調試頁面對調用的方法測試正常不?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-07-13 10:49 | Harrison
          To 凍僵的魚
          十分感謝您的回復先!
          沒錯,我的DWR調用很正常,后臺Debug時,在service里也返回的正常的數據。在FF下的FireBug中也看到了script的response。

          另外,我的msn: gyao1979@hotmail.com , 想和您深入交流。謝謝!  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-08-12 23:33 | jiajiacat
          謝謝,不過 findMeetingby(Map condition) 非范型,dwr老是出
          WARN DefaultConverterManager:59 - Missing type info for getItems(0<0>). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml的警告,如何解決?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-08-15 10:20 | xx
          根本就顯示不出數據,dwr以及該目錄下的js怎么沒有?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-08-31 09:28 | 凍僵的魚
          @jiajiacat
          dwr.xml配置一下signatures就行了  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-08-31 09:30 | 凍僵的魚
          @xx
          由于這里只能上傳2M附件,我把例子lib目錄里面dwr.jar和spring.jar刪掉了,你把dwr2.0.1、Spring2.0.4放進去就能運行了。
            回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-09-27 17:29 | xpy
          十分感謝您!還有些問題想問問。我MSN:z278440337@126.com  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-11-08 17:26 | powe
          麻煩樓主解答下,我后臺返回的數據是個List類型的,List的元素是Bean,那為什么頁面沒數據顯示阿,也沒報錯。ListRange類型的我的包里怎么沒有!  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2007-12-13 15:40 | 凍僵的魚
          @powe
          不好意思,最近比較忙,很少上blog
          "List的元素是Bean", 你在dwr.xml有沒有定義相應的convert bean?
          例子里面的ListRange類,你可以不使用它,只需要在后臺按格式封裝數據就行:
          public ListRange findMeetingby(Map condition) {
          .......
          hquery.setOrderby(sb.toString());
          List ls = this.getBaseDao().executeQuery(hquery);
          //return new ListRange(ls.toArray(), totalRecords); //這里可以不使用ListRange類

          Map result = new HashMap(2);
          result.put("totalSize", new Integer(totalRecords));
          result.put("data", ls.toArray());
          return result;
          }
            回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2008-02-28 22:27 | jw
          這個支持排序嗎,在哪個地方啊?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2008-03-15 22:40 | yinhao
          看來樓主,對EXT有很深的研究呀.
          小弟,最近出現了一個問題,煩了我好幾天呀.不知道樓主能不能幫小弟解決一下.
          在下,不勝感激.

          當我訪問DWR里面的方法時,數據返回正常.可是到頁面EditGrid里面卻只有列標題.表格里面沒有任何數據.而且,頁面也沒有報錯.

          急救.


            回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子[未登錄]
          2008-04-02 16:40 | sean
          怎么沒有排序的功能啊?  回復  更多評論
            
          # re: 結合dwr的yui-ext分頁例子
          2010-02-16 15:45 | kingdy
          非常感謝分享,在搞一個ext和dwr整合的項目,現在問題解決了。  回復  更多評論
            

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


          網站導航:
           

          <2007年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(3)

          隨筆檔案(4)

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 14086
          • 排名 - 2061

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永福县| 游戏| 车致| 封开县| 马龙县| 花莲市| 夏邑县| 宿松县| 沅江市| 枝江市| 多伦县| 花莲县| 黑龙江省| 三台县| 张掖市| 霍州市| 宁安市| 灌南县| 双鸭山市| 松阳县| 海兴县| 九龙城区| 常山县| 沧州市| 城固县| 营山县| 黎川县| 齐齐哈尔市| 汨罗市| 黎城县| 金塔县| 罗源县| 延安市| 东山县| 华池县| 古交市| 上林县| 曲周县| 方城县| 琼结县| 石景山区|