Запускать функцию controllerа всякий раз, когда открывается или отображается вид

Я создаю приложение с угловым + ионным, которое использует classическое трехкнопочное меню внизу с тремя вкладками ионов в нем. Когда пользователь щелкает вкладку, этот шаблон открывается через ui-router.

У меня такие состояния:

$stateProvider .state('other', { url: "/other", abstract: true, templateUrl: "templates/other/other.html" }) 

В шаблоне я делаю что-то вроде:

  

Я знаю, что могу написать функцию doSomething () в моем controllerе и просто называть ее вручную. Тем не менее, это дает мне ту же проблему. Я не могу понять, как вызвать функцию doSomething () более одного раза, когда кто-то открывает это представление.

Прямо сейчас функция doSomething () вызывается просто отлично, но только в первый раз, когда пользователь открывает окно просмотра / вкладки. Я хотел бы вызвать функцию (для обновления геолокации), когда пользователь открывает это представление или вкладку.

Что было бы правильным способом реализовать это?

Спасибо за помощь!

Если вы назначили определенный controller для своего вида, ваш controller будет вызываться каждый раз, когда ваш просмотр загружается. В этом случае вы можете выполнить некоторый код в своем controllerе сразу после его вызова, например, следующим образом:

  

И в вашем controllerе:

 app.controller('indexController', function($scope) { /* Write some code directly over here without any function, and it will be executed every time your view loads. Something like this: */ $scope.xyz = 1; }); 

Изменить. Вы можете попытаться отслеживать изменения состояния, а затем выполнять некоторый код при изменении маршрута и посещении определенного маршрута, например:

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

Вы можете найти более подробную информацию здесь: события изменения состояния .

По умолчанию ваши controllerы были кешем, и именно поэтому ваш controller только один раз выстрелил. Чтобы отключить кеширование для определенного controllerа, вы должны изменить свое .config(..).state и установить для параметра cache значение false . например:

  .state('myApp', { cache: false, url: "/form", views: { 'menuContent': { templateUrl: "templates/form.html", controller: 'formCtrl' } } }) 

для дальнейшего чтения, пожалуйста, посетите http://ionicframework.com/docs/api/directive/ionNavView/

Следуя ответу и ссылке от AlexMart , что-то вроде этого работает:

 .controller('MyCtrl', function($scope) { $scope.$on('$ionicView.enter', function() { // Code you want executed every time view is opened console.log('Opened!') }) }) 

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

Просмотр жизненного цикла

Чтобы повысить производительность, мы улучшили способность Ionic кэшировать элементы представления и данные области. Как только controller инициализируется, он может сохраняться на протяжении всей жизни приложения; он просто скрыт и удален из цикла просмотра. Поскольку мы не восстанавливаем область действия, мы добавили события, для которых мы должны слушать, когда вы снова вводите цикл просмотра.

Чтобы увидеть полное описание и события $ ionicView, перейдите по ссылке: http://ionicframework.com/blog/navigating-the-changes/

Почему бы вам не отключить кеш-представление с cache-view = “false” ?

На ваш взгляд, добавьте это в представление ion-nav:

  

Или в вашем stateProvider:

 $stateProvider.state('other', { cache: false, url : '/other', templateUrl : 'templates/other/other.html' }) 

Любой из них всегда будет вызывать ваш controller.

Например, @Michael Trouw,

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

 .controller('exampleCtrl',function($scope){ $scope.$on('$ionicView.enter', function(){ // Any thing you can think of alert("This function just ran away"); }); }) 

Вы можете иметь больше примеров гибкости, например $ ionicView.beforeEnter ->, который выполняется до отображения представления. И есть еще кое-что.

Учитывая способность Ionic кэшировать элементы представления и данные о области, упомянутые выше, это может быть другим способом, если вы хотите запускать controller каждый раз при загрузке представления. Вы можете глобально отключить механизм кеширования, используемый ионным путем:

$ionicConfigProvider.views.maxCache(0);

Иначе, как я это делал для меня, делал

 $scope.$on("$ionicView.afterLeave", function () { $ionicHistory.clearCache(); }); 

Это необходимо, чтобы очистить кеш, прежде чем оставлять представление для повторного запуска controllerа каждый раз, когда вы вводите обратно.

Вероятно, это то, что вы искали:

Ионный кеширует ваши представления и, следовательно, ваши controllerы по умолчанию (максимум 10) http://ionicframework.com/docs/api/directive/ionView/

Есть события, которые вы можете подключить, чтобы позволить вашему controllerу делать определенные вещи на основе этих ионных событий. см. здесь: http://ionicframework.com/blog/navigating-the-changes/

У меня была аналогичная проблема с ионной, когда я пытался загрузить собственную камеру, как только я выбираю вкладку камеры. Я решил проблему, установив controller на компонент ионного вида для вкладки камеры (в tabs.html), а затем вызывая метод $ scope, который загружает мою камеру (addImage).

В www / templates / tabs.html

     

Метод addImage, определенный в AddMediaCtrl, загружает собственную камеру каждый раз, когда пользователь щелкает вкладку «Камера». Мне не нужно было ничего менять в угловом кеше, чтобы это работало. Надеюсь, это поможет.

  • Как очистить кеш шаблонов?
  • Угловая загрузка файла
  • Angular2: приложение аварийно завершает работу / становится невосприимчивым после обнаружения исключения / ошибки
  • Как отформатировать дату как dd / MM / yyyy в Angular 2 с помощью труб?
  • Угловой валидатор, который опирается на несколько полей формы
  • Как заставить Angular2 связывать компонент в innerHTML
  • Динамически добавлять слушателя событий в Angular 2
  • Angular2: Сделать дорожки нечувствительными к регистру
  • Угловые 2 Параметры раскрывающегося списка Значение по умолчанию
  • Просмотр не обновляется при изменении в Angular2
  • Создайте новый экземпляр classа с зависимостями, не понимая поставщика фабрики
  • Давайте будем гением компьютера.