【问题标题】:Vertical and horizontal scrollable ion-content with ion-infinite-scroll only vertically离子无限滚动的垂直和水平滚动离子内容仅垂直
【发布时间】:2014-10-29 09:24:06
【问题描述】:

在我的 ion-content 中,我有一个列表,当滚动到底部时会加载更多项目(由调用“LoadMore()”的 ion-infinite-scroll 提供)。 问题是,如果我将 direction = xy 设置为 ion-content,如果我垂直和水平滚动,则 ion-infinite-scroll 会调用“LoadMore()”。

我的 ion-infinite-scroll 可以在垂直滚动时只调用“LoadMore()”吗?

【问题讨论】:

    标签: scroll ionic-framework infinite-scroll


    【解决方案1】:

    目前 ionic 版本 beta.13 不支持此功能。 我已经在离子存储库(https://github.com/driftyco/ionic/issues/1073)上发布了我建议的解决方案

    我创建了 'ion-infinite-scroll-fixed' 指令,仅在最后一个 if 块中有所不同:

    .directive('ionInfiniteScrollFixed', ['$timeout', function($timeout) {
      function calculateMaxValue(distance, maximum, isPercent) {
        return isPercent ?
          maximum * (1 - parseFloat(distance,10) / 100) :
          maximum - parseFloat(distance, 10);
      }
      return {
        restrict: 'E',
        require: ['^$ionicScroll', 'ionInfiniteScrollFixed'],
        template: '<i class="icon {{icon()}} icon-refreshing"></i>',
        scope: true,
        controller: ['$scope', '$attrs', function($scope, $attrs) {
          this.isLoading = false;
          this.scrollView = null; //given by link function
          this.getMaxScroll = function() {
            var distance = ($attrs.distance || '2.5%').trim();
            var isPercent = distance.indexOf('%') !== -1;
            var maxValues = this.scrollView.getScrollMax();
            return {
              left: this.scrollView.options.scrollingX ?
                calculateMaxValue(distance, maxValues.left, isPercent) :
                -1,
              top: this.scrollView.options.scrollingY ?
                calculateMaxValue(distance, maxValues.top, isPercent) :
                -1
            };
          };
        }],
        link: function($scope, $element, $attrs, ctrls) {
          var scrollCtrl = ctrls[0];
          var infiniteScrollCtrl = ctrls[1];
          var scrollView = infiniteScrollCtrl.scrollView = scrollCtrl.scrollView;
    
          $scope.icon = function() {
            return angular.isDefined($attrs.icon) ? $attrs.icon : 'ion-loading-d';
          };
    
          var onInfinite = function() {
            $element[0].classList.add('active');
            infiniteScrollCtrl.isLoading = true;
            $scope.$parent && $scope.$parent.$apply($attrs.onInfinite || '');
          };
    
          var finishInfiniteScroll = function() {
            $element[0].classList.remove('active');
            $timeout(function() {
              scrollView.resize();
              checkBounds();
            }, 0, false);
            infiniteScrollCtrl.isLoading = false;
          };
    
          $scope.$on('scroll.infiniteScrollComplete', function() {
            finishInfiniteScroll();
          });
    
          $scope.$on('$destroy', function() {
            void 0;
            if(scrollCtrl && scrollCtrl.$element)scrollCtrl.$element.off('scroll', checkBounds);
          });
    
          var checkBounds = ionic.animationFrameThrottle(checkInfiniteBounds);
    
          //Check bounds on start, after scrollView is fully rendered
          setTimeout(checkBounds);
          scrollCtrl.$element.on('scroll', checkBounds);
    
          function checkInfiniteBounds() {
            if (infiniteScrollCtrl.isLoading) return;
    
            var scrollValues = scrollView.getValues();
            var maxScroll = infiniteScrollCtrl.getMaxScroll();
    
            if ((maxScroll.left !== -1 && scrollValues.left >= maxScroll.left && $attrs.notOnHorizontal !=="true") ||
                (maxScroll.top !== -1 && scrollValues.top >= maxScroll.top && $attrs.notOnVertical !=="true")) {
              onInfinite();
            }
          }
        }
      };
    }]);
    

    在我的 HTML 中:

     <ion-infinite-scroll-fixed 
              not-on-horizontal="true"
              ng-if="infiniteScroll.canLoad"
              on-infinite="infiniteScroll.loadMore();"
              distance="1%">
     </ion-infinite-scroll-fixed>
    

    我希望这可以帮助某人:)

    【讨论】: