angularjs+ionic的app端分頁和條件

灬小乙發表於2018-04-17

做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

相關文章