У меня есть представление в мобильном приложении Ionic, которое регулярно обновляет данные в фоновом режиме. Я хочу, чтобы это прекратилось, когда:
Сейчас я выполняю следующие действия:
$scope.$on('$ionicView.beforeLeave', pauseUpdates);
$scope.$on('$ionicView.enter', restartUpdates);
document.addEventListener("pause", pauseUpdates, false);
document.addEventListener("resume", restartUpdates, false);
Тем не менее, это вводит граничный случай, когда пользователь переходит в мое представление, затем возвращается к другому представлению, помещает приложение в фоновый режим и затем переключается обратно на него (я перезапускаю обновления, когда не должен был).
Прежде чем перейти к редактированию переменной isNotCurrentView для отслеживания - я об этом совершенно неправильно? Есть ли более простой способ отслеживать мой статус? Я всегда тайно чувствовал, что использование addEventListener было не очень-угловым способом для этого...
После небольшого копания я нашел более элегантное решение. Согласно 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, поскольку это не отключается, когда ваш контроллер выходит из поля зрения.
Знаете ли вы, что вы можете полагаться на событие $ 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).