离子无限滚动循环永远调用无限回调



>问题:如果我在on-finite回调尚未完成处理时退出当前ion-view,则on-infinite回调将开始循环调用,直到应用程序冻结,即使我不再位于安装ion-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 秒一次。也就是说,loadMore()是在循环中调用的。

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

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

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

尝试下面的代码来停止加载更多回调。

.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)
{});
}

尝试以下代码以实现无限循环功能

.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;
}
}

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

最新更新