>问题:如果我在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;
}
}
如果您需要任何帮助,请告诉我:)