在页面加载时调用 Ionic 无限滚动功能

Ionic infinite scroll function invoked on page load

我正在使用 ionic 框架创建一个基本的 Feed 应用程序。我进行了复习,但我的 ion-infinite-scroll 遇到了问题。

Feed.html

<ion-content ng-controller="FeedController" > 
    <ion-refresher pulling-text="Pull to refresh.." on-refresh="get_feeds()" refreshing-text="Fetching ..." refreshing-icon="ion-loading-b">
    </ion-refresher>
    <ion-list>
        <ion-item ng-repeat="question in questions">
            <div class="item item-divider">
{{question.question}}
            </div>
            <div class="item" ng-bind-html="question.answer | trustHtml">
            </div>
        </ion-item>
    </ion-list>
    <ion-infinite-scroll
        on-infinite="get_more()"
        distance="1%">
    </ion-infinite-scroll>
</ion-content>

Feed.js

 (function(){
    "use strict";
    angular.module( 'app.controllers' ).controller( 'FeedController', 
        [ 'eTobb', 'Users', '$scope', '$timeout', function( eTobb, Users, $scope, $timeout) {

            var pageIndex = 1;

            $scope.questions = [];

            $scope.get_feeds = function(pageIndex){
                eTobb.get($scope.apiCall, { user_id: Users.id, page: 0 }, function(response) {
                    if ( response ){
                        $scope.questions = $scope.questions.concat(response);
                        console.log($scope.questions);
                    }
                })
                .finally(function(){
                    $scope.$broadcast('scroll.refreshComplete');
                    $scope.$broadcast('scroll.infiniteScrollComplete');
                });
            };

            $scope.get_more = function(){
                $scope.get_feeds(pageIndex);
                pageIndex = pageIndex + 1; 
                console.log('why the hell am i being called?');
            };
        }
        ]);
})(); 

问题

在on-infinite 属性上定义的方法在页面加载时调用两次,然后每次到达页面底部时正常调用(一次)。 有谁知道为什么会这样?

你可以在ion-infinite-scroll上使用ng-if,这样当没有数据时,on-infinite的handler不会被调用。

<ion-infinite-scroll
        on-infinite="get_more()"
        distance="1%"
        ng-if="questions.length">
 </ion-infinite-scroll>

我也 运行 遇到了这个问题,但是使用 ng-if 没有解决问题,我也不认为这是解决这个问题的正确方法。

根据 Ionic 的 documentation,您只能使用 ng-if 来指示没有更多数据可用,并防止无限滚动器对 "get_more" 方法进行额外调用。

我发现在页面加载期间发生此意外 "get_more()" 调用的原因是无限滚动条认为在第一次加载期间没有足够的内容(即:初始加载没有提供足够的结果来填满页面),因此它立即发起另一个加载请求。

在我的特定情况下,我已返回足够多的记录来填充页面,但是无限滚动条仍在请求更多。我的列表中大部分都是图片,我认为滚动条调用 "get_more()" 是由于图片加载和检查页面是否已填满之间的时间问题。

无论如何,我的问题的解决方案是告诉它不要立即对负载执行边界检查;您使用立即检查属性来执行此操作,即:

<ion-infinite-scroll immediate-check="false" on-infinite="vm.localDataManager.getData()" ng-if="vm.localDataManager.canGetData()" distance="1%">

'Ionic infinite scroll function invoked on page load'的答案是 immediate-check="false"ion-infinite-scroll

RMD 的回答在计算机上为我解决了这个问题,但是当 运行 我在 Android 上的应用程序时,我的 vm.loadMore() 函数被立即调用,即使 immediate-check="false" 已设置在我的 ion-infinite-scroll 元素上。我通过向控制器和我的 ion-infinite-scroll 元素添加一个辅助变量 vm.initialSearchCompleted = false; 来解决它:

<ion-infinite-scroll
  on-infinite="vm.loadMore()"
  distance="1%"
  immediate-check="false"
  ng-if="vm.canLoadMoreResults && vm.initialSearchCompleted">
</ion-infinite-scroll>

当对我的 vm.search() 函数的初始调用完成时,我设置了 vm.initialSearchCompleted = true;。那解决了问题。