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

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

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

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

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

<ion-nav-view name="other" ng-init="doSomething()"></ion-nav-view>

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

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

Каким будет правильный способ реализовать это?

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

Ответ 1

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

<ion-nav-view ng-controller="indexController" name="other" ng-init="doSomething()"></ion-nav-view>

И в вашем контроллере:

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){ ... })

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

Ответ 2

По умолчанию ваши контроллеры были кешем, и именно поэтому ваш контроллер только один раз выстрелил. Чтобы отключить кеширование для определенного контроллера, вы должны изменить свой .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/

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

По-вашему, добавьте это в представление ion-nav-like:

<ion-nav-view name="other" cache-view="false"></ion-nav-view>

Или в вашем stateProvider:

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

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

Ответ 7

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

$ionicConfigProvider.views.maxCache(0);

Иначе, способ, которым я работал у меня, делал

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

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

Ответ 8

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

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

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

Ответ 9

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

В www/templates/tabs.html

  <ion-tab title="Camera" icon-off="ion-camera" icon-on="ion-camera" href="#/tab/chats" ng-controller="AddMediaCtrl" ng-click="addImage()">
    <ion-nav-view  name="tab-chats"></ion-nav-view>
  </ion-tab>

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