Ион-бесконечный цикл прокрутки навсегда вызывает бесконечный обратный вызов

Проблема: если я выйду из текущего 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)
    {});
}
Другие вопросы по тегам