Я создаю приложение с 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 () вызывается нормально, но только в первый раз, когда это представление / вкладка открывается пользователем. Я хотел бы вызывать функцию (для обновления геолокации) всякий раз, когда пользователь открывает это представление или вкладку.
Как правильно это реализовать?
Спасибо за помощь!
источник
Ответы:
Если вы назначили определенный контроллер вашему представлению, то ваш контроллер будет вызываться каждый раз, когда ваше представление загружается. В этом случае вы можете выполнить некоторый код в своем контроллере, как только он будет вызван, например, таким образом:
<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){ ... })
Вы можете найти более подробную информацию здесь: События изменения состояния .
источник
cache-view
false поможет? ionicframework.com/docs/api/directive/ionView search for cache-viewПо умолчанию ваши контроллеры были кешированы, поэтому ваш контроллер запускается только один раз. Чтобы отключить кеширование для определенного контроллера, вам нужно изменить свой
.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/
источник
$state.go('app.statename', {}, {reload:true});
( подробнее , источник ).Следуя ответу и ссылке от AlexMart , работает что-то вроде этого:
.controller('MyCtrl', function($scope) { $scope.$on('$ionicView.enter', function() { // Code you want executed every time view is opened console.log('Opened!') }) })
источник
$ionicView.beforeEnter
это, вероятно, то, что вы хотите.$ionicView.enter
срабатывает после того, как "вид полностью открыт" . Если вы используете анимированные переходы между видами, то using$ionicView.beforeEnter
выполняется до начала перехода. Это означает, что вы можете запускать свой код во время перехода, что, скорее всего, приведет к тому, что ваше приложение станет более «быстрым».Я столкнулся с той же проблемой, и здесь я оставляю причину такого поведения для всех остальных с той же проблемой.
Чтобы увидеть полное описание и события $ ionicView, перейдите по адресу : http://ionicframework.com/blog/navigating-the-changes/
источник
Почему бы вам не отключить кеш просмотра с помощью cache-view = "false" ?
На ваш взгляд, добавьте это в ion-nav-view следующим образом:
<ion-nav-view name="other" cache-view="false"></ion-nav-view>
Или в вашем stateProvider:
$stateProvider.state('other', { cache: false, url : '/other', templateUrl : 'templates/other/other.html' })
Любой из них сделает ваш контроллер вызываемым всегда.
источник
Например, @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 ->, который запускается перед отображением представления. И это еще не все.
источник
Учитывая способность Ionic кэшировать элементы представления и данные области, упомянутые выше, это может быть другим способом сделать, если вы хотите запускать контроллер каждый раз при загрузке представления. Вы можете глобально отключить механизм кеширования, используемый ionic, выполнив:
$ionicConfigProvider.views.maxCache(0);
Иначе то, как у меня это работало для меня, делало
$scope.$on("$ionicView.afterLeave", function () { $ionicHistory.clearCache(); });
Это необходимо для очистки кеша перед выходом из представления для повторного запуска контроллера каждый раз, когда вы снова входите.
источник
Вероятно, это то, что вы искали:
Ionic кэширует ваши представления и, следовательно, ваши контроллеры по умолчанию (максимум 10) http://ionicframework.com/docs/api/directive/ionView/
Есть события, к которым вы можете подключиться, чтобы позволить вашему контроллеру делать определенные вещи на основе этих ионных событий. см. здесь пример: http://ionicframework.com/blog/navigating-the-changes/
источник
ViewContentLoading
иViewContentLoaded
событие :)У меня была аналогичная проблема с ionic, когда я пытался загрузить родную камеру, как только я выбираю вкладку камеры. Я решил проблему, установив в контроллере компонент ion-view для вкладки камеры (в 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, чтобы это работало. Надеюсь, это поможет.
источник