Ион-бесконечный цикл прокрутки навсегда вызывает бесконечный обратный вызов
Проблема: если я выйду из текущего ion-view
когда on-finite
обратный вызов не закончил обработку, 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()
вызывается в цикле.
В реальном сценарии эта ошибка приводит к сильному зависанию приложения. В некоторых ссылках эта проблема была решена, но решения не найдено (ионный форум закрыт, кстати). Некоторые решения там предлагают звонить infiniteScrollComplete
внутри $apply()
, но это не решает проблему и фактически вызывает digest already in progress
ошибка. Другие предлагают использовать $timeout(...,0)
в качестве альтернативы $apply()
но все же проблема проявится, если, например, ваш loadMore()
выполняет асинхронные вызовы к вашему серверу, в таком случае есть вероятность, что пользователь выйдет из режима просмотра, пока loadMore()
занят.
Есть ли предлагаемый обходной путь к этому?
Ионная команда: это ошибка. И вся документация повсюду об ионно-бесконечной прокрутке полностью игнорирует это. Там должно быть, по крайней мере, предупреждение. Моя ионная версия 1.7.16.
2 ответа
Попробуйте код ниже для функциональности бесконечного цикла
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;
}
}
Пожалуйста, дайте мне знать, если вам нужна помощь:)
Попробуйте приведенный ниже код для остановки загрузки большего количества обратных вызовов.
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)
{});
}