sencha touch list(列表)、 store(數據源)、model(模型)詳解


先從model講起

代碼如下:

  1 //求職
  2 Ext.define('app.model.Staff', {
  3     extend: 'Ext.data.Model',
  4     config: {
  5         fields: [{
  6             name: 'id',
  7             type: 'int'
  8         },
  9         {
 10             //用戶id
 11             name: 'uid',
 12             type: 'int'
 13         },
 14         {
 15             //姓名
 16             name: 'fullname',
 17             type: 'string',
 18             convert: function (v, record) {
 19                 var display = record.data.display_name;
 20                 if (display == 1) {
 21                     return v;
 22                 } else if (display == 2) {
 23                     return 'N' + record.data.id;
 24                 }
 25                 return v.substring(0, 1) + '**';
 26             }
 27         },
 28         {
 29             //年齡
 30             name: 'birthdate',
 31             type: 'int',
 32             convert: function (v, record) {
 33                 var time = new Date().getFullYear();
 34                 return time - v;
 35             }
 36         },
 37         {
 38             //姓隱藏程度
 39             name: 'display_name',
 40             type: 'string'
 41         },
 42         {
 43             //全職兼職
 44             name: 'nature_cn',
 45             type: 'string'
 46         },
 47         {
 48             //標簽
 49             name: 'tag',
 50             type: 'string',
 51             convert: function (v, record) {
 52                 if (!v) {
 53                     return '';
 54                 }
 55                 var taglist = v.split('|');
 56                 var tag = [];
 57                 for (var i in taglist) {
 58                     var j = {
 59                         title: taglist[i].split(',')[1]
 60                     };
 61                     tag.push(j);
 62                 }
 63                 return tag;
 64             }
 65         },
 66         {
 67             //學歷
 68             name: 'education_cn',
 69             type: 'string'
 70         },
 71         {
 72             //工作經驗
 73             name: 'experience_cn',
 74             type: 'string',
 75             convert: function (v, record) {
 76                 return v != "無經驗" ? v + '經驗' : v;
 77             }
 78         },
 79         {
 80             //性別
 81             name: 'sex_cn',
 82             type: 'string'
 83         },
 84         {
 85             //地址
 86             name: 'householdaddress',
 87             type: 'string'
 88         },
 89         {
 90             //刷新時間
 91             name: 'refreshtime',
 92             type: 'string'
 93         },
 94         {
 95             //期望崗位
 96             name: 'intention_jobs',
 97             type: 'string'
 98         }]
 99     }
100 });

值得注意的是convert方法,有兩個參數其中v是當前字段的值,record則是整個model的值
可以根據需求來二次加工數據,比如說后台返回的值是0,1而你希望他顯示的值是男,女這種情況

下面再說說store

代碼如下:

 1 Ext.define('app.store.StaffList', {
 2     extend: 'Ext.data.Store',
 3     config: {
 4         model: 'app.model.Staff',//對應的數據模型,只有模型中已經定義的字段才能存儲到store中,沒有定義的字段是不是存儲的
 5         storeId: 'staffList', //給他一個id,以便於list中指定store。以及通過Ext.getStore(id)來得到store
 6         autoLoad: false,//在index頁面啟動時不自動加載數據
 7         pageSize: 7, //想后台傳遞一個參數pageSize值為7,這里的意思是告訴后台每頁顯示7條數據,用於分頁。
 8         //還有一個參數limit,用來告訴后台當前顯示第幾頁。
 9         proxy: {
10             type: 'jsonp',//向后台讀取數據的方式,可以是jsonp或者ajax
11             url: MyUtil.postUrl + StaffList.ashx',//請求數據的地址
12             reader: {
13                 type: "json",//返回數據的格式
14                 rootProperty: 'result',//返回數據的根節點
15                 totalProperty: 'totalCounts'//數據總數,后台不給也沒事。不過這樣就沒辦法確定是不是最后一頁了
16             }
17         }
18     }
19 });

需要注意的是,pageSize的作用並不是指在list中每次顯示多少條數據,而是告訴后台你每次要顯示多少條數據,你要7條后台給你10條也是可以的,給你10條list就會顯示10條數據上去

就像小學生問媽媽要零用錢,小學生問媽媽要5塊,媽媽心情好了給10塊也是可以的,心情不好一塊也不給。不管給多少,小學生都得乖乖的把錢放到兜兜里面。

對於list可以做一個小小的擴展

 1 /*
 2 *自定義列表頁面
 3 */
 4 Ext.define('app.view.util.MyList', {
 5     alternateClassName: 'myList',
 6     extend: 'Ext.List',
 7     xtype: 'myList',
 8     requires: ['Ext.plugin.ListPaging', 'Ext.plugin.PullRefresh'],
 9     config: {
10         cls: 'list',//自定義css
11         plugins: [{
12             xclass: 'Ext.plugin.ListPaging',//分頁插件
13             autoPaging: true,//滾動到最底部時是否自動加載下一頁數據
14             noMoreRecordsText: '沒有更多內容了',
15             loadMoreText: '加載更多...'//加載更多按鈕顯示內容
16         },
17         {
18             xclass: 'Ext.plugin.PullRefresh',//下拉刷新插件
19             lastUpdatedText: '上次刷新時間:',
20             loadingText: '加載中...',
21             pullRefreshText: '下拉可以手動刷新',
22             releaseRefreshText: '松開可以刷新',
23             refreshFn: function (loaded, arguments) {//開始刷新觸發的時間,默認效果是只刷新第一頁數據。不管后面顯示了多少數據
24                 loaded.getList().getStore().loadPage(1);//這里進行了處理,觸發時清空所有數據,重新加載第一頁數據。
25             }
26         }],
27         loadingText: false,  //禁用加載遮罩,防止跳轉時頁面卡頓,使用統一的遮罩效果
28         emptyText: '沒有更多內容了'
29     }
30 });

一個list這樣就可以了

 1 Ext.define('app.view.job.StaffList', {
 2     alternateClassName: 'staffList',
 3     extend: 'app.view.util.MyList',
 4     requires: ['app.view.job.StaffInfo'],
 5     xtype: 'staffList',
 6     config: {
 7         itemHeight:68,
 8         store: 'staffList',
 9         itemTpl: new Ext.XTemplate(
10         '<div class="left">',
11             '<div class="row">{fullname}</div><div class="row sm grayF">{education_cn} - {experience_cn} - {nature_cn}</div><div class="row sm grayF">{sex_cn} - {householdaddress}</div>',
12         '</div>',
13         '<div class="right"><div class="row grayF">{refreshtime}</div><div class="row sm orangeF">{intention_jobs}</div></div>')
14     }
15 });

大概就是這樣吧,附圖一張


免責聲明!

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



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