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