做app專案積分商城的商品列表需要分頁顯示
實現:
ionic滾動條:ion-scroll 用於建立一個可滾動的容器。
附:菜鳥教程:http://www.runoob.com/ionic/ionic-scroll.html
隸屬於ionContent
或 ionScroll,要寫在ion-content才有效
ion-infinite-scroll
當使用者到達頁尾或頁尾附近時,ionInfiniteScroll指令允許你呼叫一個函式 。
當使用者滾動的距離超出底部的內容時,就會觸發你指定的on-infinite。
ion-refresher
允許你新增下拉重新整理滾動檢視。
<!-- <ion-refresher> 下拉重新整理指令 --> <ion-refresher pulling-text="Pull to refresh" on-refresh="doRefresh()"></ion-refresher> <!-- ion-infinite-scroll 上拉載入資料指令 distance預設1% nf-if的值為false時,就禁止執行on-infinite --> <ion-infinite-scroll ng-if="moredata" on-infinite="loadMore()" distance="1%" ></ion-infinite-scroll>
1. on-refresh 下拉觸發的函式 函式執行結束之前必須廣播下該事件結束 $scope.$broadcast(`scroll.refreshComplete`);
2. on-infinite 上拉觸發的函式 同樣需要廣播事件結束 $scope.$broadcast(`scroll.infiniteScrollComplete`);
js程式碼:
1 //載入更多 2 // $scope.items = []; 3 //無限載入 4 $scope.moredata = true; 5 6 var sName = "``";//初始化搜尋條件,預設 7 var currentPage = 0;//初始化頁碼 8 var intData = [];//初始化陣列 9 10 //搜尋事件 11 $scope.search = function() { 12 if($scope.searchName != undefined && $scope.searchName != "" && $scope.searchName != null) { 13 sName = $scope.searchName; 14 currentPage = 0; 15 // intData = []; 16 intData.splice(0,intData.length);//清空陣列 17 $scope.loadMore(); 18 } 19 } 20 21 //下拉重新整理 22 $scope.doRefresh = function() { 23 currentPage = 1; 24 intData = []; 25 $scope.moredata = true; 26 // $scope.loadMore(); 27 HttpRequest.query("jdApi/commodity/getCommodityList/" + currentPage + "/" + sName + "/``", true) 28 .success(function(objs) { 29 var result = angular.fromJson(objs.jdBaseMsgBean.result); 30 31 //獲取資料,在原來的資料基礎上追加資訊 32 var lists = intData; 33 if(lists.length > 0 ){ 34 intData = new Array().concat(lists, result.data); 35 }else{ 36 intData = result.data; 37 } 38 $scope.gifts = intData; 39 40 if(result.totalRecord <= currentPage*result.pageSize) { 41 $scope.moredata = false; 42 } 43 //自動請求後臺多次問題解決 44 $timeout(function () { 45 $scope.$broadcast(`scroll.refreshComplete`); 46 }, 1000); 47 }); 48 49 } 50 51 //上拉載入 52 $scope.loadMore = function() { 53 // $http.get(`/more-items`).success(function(items) { 54 // useItems(items); 55 // $scope.$broadcast(`scroll.infiniteScrollComplete`); 56 // }); 57 currentPage += 1; 58 HttpRequest.query("jdApi/commodity/getCommodityList/" + currentPage + "/" + sName + "/``", true) 59 .success(function(objs) { 60 var result = angular.fromJson(objs.jdBaseMsgBean.result); 61 62 //獲取資料,在原來的資料基礎上追加資訊 63 var lists = intData; 64 if(lists.length > 0 ){ 65 intData = new Array().concat(lists, result.data); 66 }else{ 67 intData = result.data; 68 } 69 $scope.gifts = intData; 70 71 if(result.totalRecord <= currentPage*result.pageSize) { 72 $scope.moredata = false; 73 } 74 // if(result.totalPage == currentPage) { 75 // $scope.moredata = false; 76 // } 77 // if(result.data.length < result.pageSize){ 78 // $scope.moredata = false; 79 // } 80 81 // $scope.$broadcast(`scroll.infiniteScrollComplete`); 82 //自動請求後臺多次問題解決--ionic 上拉重新整理 ion-infinite-scroll 自動呼叫多次問題解決 83 timer = $timeout(function () { 84 $scope.$broadcast(`scroll.infiniteScrollComplete`); 85 }, 1000); 86 }); 87 } 88 89 $scope.$on(`$stateChangeSuccess`, function() { 90 $scope.loadMore(); 91 }); 92 93 $scope.$on("$destroy", function () { 94 //清除配置,不然scroll會重複請求 95 $timeout.cancel(timer); 96 });
說明:
1.moredata,頁面用ng-if=”moredata”,來判斷是否載入資料。當滾動條到底部,並且伺服器沒有資料的時候,使用ng-if指令來控制便籤是否存在,即,是否繼續向伺服器傳送請求(如果沒有這個功能,會不停的向伺服器傳送請求)。
2.$scope.$on上的$stateChangeSuccess和$destroy
如果在下拉標籤中使用immediate-check=”false”屬性的話
<ion-infinite-scroll immediate-check="false" ng-if="moredata" on-infinite="loadMore()" distance="1%"></ion-infinite-scroll>
$stateChangeSuccess配置是資料載入:是否在頁面載入後立刻觸發on-infinite的方法,設為false後,則只有滾動到頁面邊緣時才會觸發,即使頁面載入出來已經到最底部,不滾動一下的話也是不會觸發的。
3.HttpRequest.query(“jdApi/commodity/getCommodityList/” + currentPage + “/” + sName + “/“”, true)是service層封裝的$http服務,如下
1 query: function(url, isLoad){ 2 if(isLoad){ 3 Prompt.showLoading(); 4 } 5 var params = {"rd": angular.randomCode()}; 6 var http = $http({ 7 method: `QUERY`, 8 params: params, 9 url: $rootScope.url.app + `services/` + url, 10 timeout:90000 11 }); 12 http.error(function(data, status, headers, config){ 13 showError(status); 14 }); 15 http.finally(function(){ 16 if(isLoad){ 17 Prompt.hideLoading(); 18 } 19 }); 20 return http; 21 }
html程式碼:
1 <ion-content class="divider-bg box-content" style=""> 2 <ion-refresher pulling-text="下拉重新整理" on-refresh="doRefresh()"></ion-refresher> 3 <ion-list> 4 <ion-item class="item-thumbnail-left item-thumbnail-left-custom item-icon-right" ng-repeat="g in gifts" href="#/tab/my/jifen/gift/{{totalScore}}/{{g.id}}"> 5 <img class="img-48 media-object pull-left" ng-src="http://img13.360buyimg.com/n4/{{g.imagePath}}" alt="{{g.name}}"> 6 <h2>{{g.name}}</h2> 7 <div class="shop-pro-list"> 8 <span class="shop-pro-list-scores"><span class="color-org">{{g.price}}</span>{{`jifen.jifen` | i18next}}</span> 9 <span><i class="exchange-btn">{{`jifen.exchangeNow` | i18next}}</i></span> 10 </div> 11 </ion-item> 12 </ion-list> 13 <ion-infinite-scroll ng-if="moredata" on-infinite="loadMore()" distance="1%"></ion-infinite-scroll> 14 </ion-content>
搜尋的程式碼:
<button class="button button-small button-search-jd" on-tap="search()">{{`jifen.search` | i18next}}</button>
解釋:on-tap為ionic事件(手勢輕擊事件)
ionic手勢事件:http://www.runoob.com/ionic/ionic-gesture-event.html
起初使用ng-click,但事件不起作用,通過查詢發現:直接在ion-list
中的ion-item
中並不能觸發ng-click
事件,可以在item中的元素上再套一層div。
Ionic 常見問題及解決方案:https://www.jianshu.com/p/b567cc657a49
注:分頁參考文件
https://blog.csdn.net/jslcylcy/article/details/76633635
https://www.cnblogs.com/dreamowneryong/p/4969264.html
ionic 上拉重新整理 ion-infinite-scroll 自動呼叫多次問題解決
加入定時器timer:https://blog.csdn.net/chenhua4088/article/details/49929279
ionic 的下拉重新整理 與 上拉載入:https://www.cnblogs.com/ailen226/p/4626166.html
列表展示頁面,分頁資料進行追加:http://hbiao68.iteye.com/blog/2295161