Надежно определять, когда просмотр не активен в ионном

0

У меня есть представление в мобильном приложении Ionic, которое регулярно обновляет данные в фоновом режиме. Я хочу, чтобы это прекратилось, когда:

  1. Это представление не является активным видом
  2. Приложение находится в фоновом режиме

Сейчас я выполняю следующие действия:

$scope.$on('$ionicView.beforeLeave', pauseUpdates);
$scope.$on('$ionicView.enter', restartUpdates);
document.addEventListener("pause", pauseUpdates, false);
document.addEventListener("resume", restartUpdates, false);

Тем не менее, это вводит граничный случай, когда пользователь переходит в мое представление, затем возвращается к другому представлению, помещает приложение в фоновый режим и затем переключается обратно на него (я перезапускаю обновления, когда не должен был).

Прежде чем перейти к редактированию переменной isNotCurrentView для отслеживания - я об этом совершенно неправильно? Есть ли более простой способ отслеживать мой статус? Я всегда тайно чувствовал, что использование addEventListener было не очень-угловым способом для этого...

Теги:
cordova
ionic

2 ответа

2
Лучший ответ

После небольшого копания я нашел более элегантное решение. Согласно https://forum.ionicframework.com/t/best-way-to-intercept-events-like-cordova-resume-and-pause-in-ionic/4720/5, хороший способ справиться с ними - для добавления обработчиков уровня документа, которые запускают широковещательные передачи с правами root:

.run(function ($ionicPlatform, $rootScope) {

    $ionicPlatform.ready(function () {
        document.addEventListener("deviceready", onDeviceReady, false);
    });

    function onDeviceReady() {

        console.log('run() -> onDeviceReady');

        document.addEventListener("pause", function (event) {
            console.log('run() -> cordovaPauseEvent');
            $rootScope.$broadcast('cordovaPauseEvent');
        });

        document.addEventListener("resume", function (event) {
            console.log('run() -> cordovaResumeEvent');
            $rootScope.$broadcast('cordovaResumeEvent');
        });
    }
}

Внутри вашего фактического контроллера вы можете обрабатывать их так:

$scope.$on('cordovaPauseEvent', pauseTotalsUpdates);

Когда представление, использующее ваш контроллер, больше неактивно, кеширование Ionic будет удерживать контроллер в памяти, но будет деактивировать его $ scope. Это означает, что ваш контроллер не будет запускать события приостановки/возобновления, если только он не является активным контроллером. Не забудьте привязать событие $ on к $ scope, а не $ rootScope, поскольку это не отключается, когда ваш контроллер выходит из поля зрения.

0

Знаете ли вы, что вы можете полагаться на событие $ stateChangeStart с https://github.com/angular-ui/ui-router/wiki?

Таким образом, вы можете сохранить текущее состояние/представление с помощью этого обработчика в контроллере (-ах):

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
...
});

Также вы можете использовать cordova-plugin-background-mode для отслеживания таких событий, как "активация режима bkg" (см. Onactivate) или "возобновление из режима bkg" (см. Ondeactivate).

  • 0
    Спасибо - правда, я правильно понимаю, что это не отслеживает мобильную паузу и возобновляет события?
  • 0
    Используете ли вы фоновый плагин, например, github.com/katzer/cordova-plugin-background-mode ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню