4

问题:如果我在回调尚未完成处理ion-view时退出当前,回调将开始在循环中被调用,直到应用程序冻结,即使我不再在安装的视图中。on-finiteon-infiniteion-infinite-scroll

这很难重现,但我找到了一种轻松体现它的方法。在视图上设置无限回调。

<ion-infinite-scroll
    immediate-check="false"
    on-infinite="loadMore()"
    distance="5%">
</ion-infinite-scroll>

然后使用$timeout人为地将功能减慢loadMore()到 2 秒。像这样的东西:

$scope.loadMore = function() {
    console.log("Loading more...");
    $timeout(function() {
        $scope.$broadcast('scroll.infiniteScrollComplete');
    }, 2000);
};

现在,触发无限滚动,当你的loadMore()函数“处理”2 秒时,离开你的视野。您会看到,即使您在另一个视图中,控制台也会继续每 2 秒打印一次“Loading more...”。也就是说,loadMore()在循环中被调用。

在实际情况下,此错误会导致应用程序严重冻结。在某些链接上,此问题已得到解决,但没有解决方案(离子论坛已关闭 atm,顺便说一句)。那里的一些解决方案建议infiniteScrollComplete在内部调用$apply(),但这并不能解决问题,实际上会触发digest already in progress错误。其他人建议使用$timeout(...,0)它作为替代方案,$apply()但问题仍然会出现,例如,如果您loadMore()对服务器进行异步调用,在这种情况下,用户仍有可能在loadMore()忙碌时退出视图。

有什么建议的解决方法吗?

Ionic 团队:这是一个错误。所有关于 ion-infinite-scroll 的文档都完全忽略了这一点。至少应该有一个警告。我的离子版本 1.7.16。

4

2 回答 2

1

尝试以下代码以停止加载更多回调。

html

<ion-view view-title="Search">
    <ion-content>
        <h1>Search</h1>
        <ion-infinite-scroll
        immediate-check="false"
        ng-if="!noMoreItemsAvailable"
        on-infinite="loadMore()"
        distance="5%">
    </ion-infinite-scroll>
</ion-content>
</ion-view>

控制器

$scope.loadMore = function()
{
    $http({
    method:'GET',
    url:'http://headers.jsontest.com/'
    }).then(function(response)
    {
        console.log(response);
        $scope.noMoreItemsAvailable = true;
    }, function(response)
    {});
}
于 2017-04-13T18:12:29.033 回答
1

尝试下面的代码以获取无限循环功能

HTML

    <ion-infinite-scroll 
        ng-if="!noMoreDaTa" on-infinite="loadData()" 
        distance="2%" immediate-check="false">
    </ion-infinite-scroll>

控制器

    $scope.loadData = function() {
       if ($scope.dataRecords.length >= $scope.total_records) {
           $scope.noMoreDaTa = true;
       }
    }

如果您需要任何帮助,请告诉我:)

于 2017-04-19T12:45:04.077 回答