ionic实现上拉加载更多(组件 ion-infinite-scroll使用,以及多次加载的问题)

开发过程中需要对展示内容实现上拉加载的更多效果,本来以为实现没有什么难度,ionic本身就提供了ion-infinite-scroll组件能够完成我们的开发需要。
先上代码

<ion-view view-title="{{i18n.org_member_info_label}}">
  <ion-content>
      <div ng-repeat="item in table.trs" on-hold="table.touch(item)" class="item item-input-inset" ng-class-odd="'oddRow'" ng-click="showDetail(item)">
        <p ng-bind="item.realName" class="input-label w25p"></p>
        <p ng-bind="item.workType"></p>
        <i class="icon ion-ios-arrow-right icon-pos-right"></i>
      </div>
      <ion-infinite-scroll on-infinite="table.query()" distance="2%" ng-if="table.isLoadMore" immediate-check="false"></ion-infinite-scroll>
  </ion-content>
</ion-view>
  $scope.table = {
      ths: CONFIG.project.orgTeamHead,
      trs: [],
      isLoadMore: true,
      currentPage: 0,
      maxPage: 1,

      /**
       * @ngdoc method
       * @name orgInfoCtrl#table.query
       * @methodOf table.query
       * @return {undefined}
       * @description Get members in this organization by workerContractList api.
       * */
      query() {
        this.currentPage += 1;
        if(this.currentPage > this.maxPage){
          this.isLoadMore = false;
          return;
        }
        apiService.getWorkerContractList({
          sid: $scope.userInfo.sid,
          team_id: data.id,
          request_status: $scope.i18n.request_status_complete_label,
          flag: 1,
          page: this.currentPage,
          limit: $scope.limit
        });
      },

      /**
       * @ngdoc method
       * @name orgInfoCtrl#table.dealData
       * @methodOf table.dealData
       * @param {Object} data - Server response.
       * @return {Undefined}
       * @description Handle response from server.
       * */
      dealData(data) {
        this.maxPage = Math.ceil(data.count / $scope.limit);
        $scope.table.trs = _.concat($scope.table.trs, data);
        this.isLoadMore = result.length >= $scope.limit;
        $timeout(() => {
          $scope.$broadcast("scroll.infiniteScrollComplete");
        });
      }
    };
    
     $scope.$on('stateChangeSuccess', function() {  
      $scope.table.query()
    });  

这里我截取了部分项目中的代码来说明实现上拉加载更多的实现,官方文档已经写得很清楚了,这里主要是提一下如何解决多次调用的问题。
1、immediate-check属性判断是否在页面载入后立即检查滚动边界 默认为true(这将导致页面载入后立即调用刷新),如果不设置为false时,可能我们在进入页面后直接调用了多次的加载更多loadMore函数(这里是query函数),设置FALSE后需要我们在进入页面后在stateChangeSuccess中调用加载更多的loadMore函数。
2、这里在处理了数据dealData中,使用了一个定时器。如果不使用这个定时器,虽然数据请求回来了,但是内容还没有充满整个屏幕,这时已经广播$broadcast加载动作已经结束,它就会再自动执行一次或者多次加载,造成数据错误
3、如果我们所有的数据都请求完成,记得设置ng-if=false,控制不在执行上拉加载更多事件
4、ng-repeat可能在手机上调试时,同样出现一次下拉,结果多次调用,这时候用collcection-repeat代替,ng-repeat在渲染页面的时候会触发页面的滚动, 导致上拉事件的触发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ionic侧边栏是一个非常实用的组件,可以让用户轻松地在不同的页面之间进行导航。ion-side-menus是Ionic中用于创建侧边栏的指令,它提供了多个选项来控制侧边栏的外观和功能。 要使用ion-side-menus指令,需要在HTML中创建一个包含ion-side-menus指令的容器元素。然后,在容器中定义一个ion-side-menu-content指令,用于指定主要内容区域。在主要内容区域中,可以使用ion-nav-view指令来显示不同的页面。 在侧边栏中,可以使用ion-side-menu指令来定义侧边栏的内容。可以在侧边栏中包含任意数量的元素,包括列表、按钮和链接等。 当用户在侧边栏中选择一个项目时,可以使用ion-tap指令来处理点击事件。ion-tap指令可以与ng-click指令一起使用,用于在视图中触发特定的函数或操作。 下面是一个示例代码,展示了如何使用ion-side-menus和ion-tap指令来创建一个具有侧边栏导航的Ionic应用: ``` <ion-side-menus> <!-- 左侧侧边栏 --> <ion-side-menu side="left"> <ion-header-bar class="bar-dark"> <h1 class="title">菜单</h1> </ion-header-bar> <ion-content> <ion-list> <ion-item ng-click="openPage('home')">首页</ion-item> <ion-item ng-click="openPage('about')">关于</ion-item> <ion-item ng-click="openPage('contact')">联系我们</ion-item> </ion-list> </ion-content> </ion-side-menu> <!-- 主要内容区域 --> <ion-side-menu-content> <ion-header-bar class="bar-dark"> <button class="button button-icon ion-navicon" ng-click="toggleLeft()"> </button> <h1 class="title">我的应用</h1> </ion-header-bar> <ion-nav-view></ion-nav-view> </ion-side-menu-content> </ion-side-menus> ``` 在上面的代码中,我们创建了一个包含ion-side-menus指令的容器元素。在容器中,我们定义了一个包含ion-side-menu指令的左侧侧边栏,并在其中添加了一些项目。在主要内容区域中,我们使用ion-nav-view指令来显示不同的页面,并使用ion-header-bar指令来添加导航栏。在导航栏中,我们添加了一个按钮,用于打开左侧侧边栏,并使用ion-tap指令来处理点击事件。 最后,我们还需要在控制器中定义一个openPage函数,用于在点击侧边栏中的项目时导航到不同的页面。 ``` .controller('MyCtrl', function($scope, $ionicSideMenuDelegate, $state) { $scope.openPage = function(page) { $ionicSideMenuDelegate.toggleLeft(false); $state.go(page); }; $scope.toggleLeft = function() { $ionicSideMenuDelegate.toggleLeft(); }; }); ``` 在上面的代码中,我们定义了一个openPage函数,用于在点击侧边栏中的项目时导航到不同的页面。我们还定义了一个toggleLeft函数,用于打开或关闭左侧侧边栏。在openPage函数中,我们通过$state.go函数来导航到不同的页面,并在导航完成后关闭左侧侧边栏。在toggleLeft函数中,我们使用$ionicSideMenuDelegate.toggleLeft函数来打开或关闭左侧侧边栏。 总之,使用ion-side-menus和ion-tap指令可以轻松创建具有侧边栏导航的Ionic应用,并实现侧边栏中项目的点击事件处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值