Tworzę aplikację z angular + ionic, która używa klasycznego menu z trzema przyciskami na dole i trzema zakładkami jonowymi. Gdy użytkownik klika kartę, szablon otwiera się za pośrednictwem routera ui.
Mam takie stany:
$stateProvider
.state('other', {
url: "/other",
abstract: true,
templateUrl: "templates/other/other.html"
})
W szablonie robię coś takiego:
<ion-nav-view name="other" ng-init="doSomething()"></ion-nav-view>
Zdaję sobie sprawę, że mogę napisać funkcję doSomething () w moim kontrolerze i po prostu wywołać ją ręcznie. To jednak daje mi ten sam problem. Nie potrafię wymyślić, jak wywołać funkcję doSomething () więcej niż raz, kiedy ktoś otworzy ten widok.
W tej chwili funkcja doSomething () jest wywoływana dobrze, ale tylko przy pierwszym otwarciu widoku / karty przez użytkownika. Chciałbym wywołać funkcję (aktualizującą geolokalizację) za każdym razem, gdy użytkownik otworzy ten widok lub kartę.
Jaki byłby prawidłowy sposób na wdrożenie tego?
Dzięki za pomoc!
źródło
Odpowiedzi:
Jeśli przypisałeś określony kontroler do swojego widoku, twój kontroler będzie wywoływany za każdym razem, gdy twój widok zostanie załadowany. W takim przypadku możesz wykonać jakiś kod w swoim kontrolerze zaraz po jego wywołaniu, na przykład w ten sposób:
<ion-nav-view ng-controller="indexController" name="other" ng-init="doSomething()"></ion-nav-view>
A w kontrolerze:
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; });
Edycja: Możesz spróbować śledzić zmiany stanu, a następnie wykonać kod, gdy trasa zostanie zmieniona i zostanie odwiedzona określona trasa, na przykład:
$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ ... })
Więcej szczegółów można znaleźć tutaj: Wydarzenia zmiany stanu .
źródło
cache-view
na fałsz pomoże? ionicframework.com/docs/api/directive/ionView search for cache-viewDomyślnie kontrolery były buforowane i dlatego kontroler został uruchomiony tylko raz. Aby wyłączyć buforowanie dla określonego kontrolera, musisz zmodyfikować swój
.config(..).state
i ustawićcache
opcję nafalse
. np .:.state('myApp', { cache: false, url: "/form", views: { 'menuContent': { templateUrl: "templates/form.html", controller: 'formCtrl' } } })
dalsze czytanie można znaleźć pod adresem http://ionicframework.com/docs/api/directive/ionNavView/
źródło
$state.go('app.statename', {}, {reload:true});
( więcej informacji , źródło ).Po odpowiedzi i linku od AlexMart działa coś takiego:
.controller('MyCtrl', function($scope) { $scope.$on('$ionicView.enter', function() { // Code you want executed every time view is opened console.log('Opened!') }) })
źródło
$ionicView.beforeEnter
jest prawdopodobnie tym, czego chcesz.$ionicView.enter
uruchamia się po „pełnym wejściu widoku” . Jeśli używasz animowanych przejść między widokami, użyj funkcji$ionicView.beforeEnter
wykonywania przed rozpoczęciem przejścia. Oznacza to, że możesz uruchamiać swój kod podczas przejścia, co prawdopodobnie doprowadzi do „szybszego” działania aplikacji.Zmierzyłem się z tym samym problemem i tutaj powód tego zachowania pozostawiam wszystkim innym z tym samym problemem.
Aby zobaczyć pełny opis i zdarzenia $ ionicView, przejdź do: http://ionicframework.com/blog/navigating-the-changes/
źródło
Dlaczego nie wyłączysz pamięci podręcznej widoku za pomocą cache-view = "false" ?
Twoim zdaniem dodaj to do widoku ion-nav w ten sposób:
<ion-nav-view name="other" cache-view="false"></ion-nav-view>
Lub w Twoim stanie Dostawca:
$stateProvider.state('other', { cache: false, url : '/other', templateUrl : 'templates/other/other.html' })
Każda z nich sprawi, że twój kontroler będzie zawsze wywoływany.
źródło
Na przykład dla @Michael Trouw,
wewnątrz kontrolera umieść ten kod. będzie działać za każdym razem, gdy ten stan zostanie wprowadzony lub aktywny, nie musisz się martwić o wyłączenie pamięci podręcznej i jest to lepsze podejście.
.controller('exampleCtrl',function($scope){ $scope.$on('$ionicView.enter', function(){ // Any thing you can think of alert("This function just ran away"); }); })
Możesz mieć więcej przykładów elastyczności, takich jak $ ionicView.beforeEnter ->, który jest uruchamiany przed wyświetleniem widoku. Jest w tym coś więcej.
źródło
Biorąc pod uwagę zdolność Ionic do buforowania elementów widoku i danych zakresu, o których mowa powyżej, może to być inny sposób, jeśli chcesz uruchamiać kontroler za każdym razem, gdy widok jest ładowany. Możesz globalnie wyłączyć mechanizm buforowania używany przez ionic, wykonując:
$ionicConfigProvider.views.maxCache(0);
W przeciwnym razie sposób, w jaki pracowałem dla mnie, działał
$scope.$on("$ionicView.afterLeave", function () { $ionicHistory.clearCache(); });
Ma to na celu wyczyszczenie pamięci podręcznej przed opuszczeniem widoku w celu ponownego uruchomienia kontrolera za każdym razem, gdy ponownie wejdziesz.
źródło
To jest prawdopodobnie to, czego szukałeś:
Ionic domyślnie buforuje Twoje widoki, a tym samym kontrolery (maksymalnie 10) http://ionicframework.com/docs/api/directive/ionView/
Istnieją zdarzenia, do których można się podłączyć, aby umożliwić kontrolerowi wykonywanie pewnych czynności w oparciu o te zdarzenia jonowe. zobacz tutaj przykład: http://ionicframework.com/blog/navigating-the-changes/
źródło
ViewContentLoading
iViewContentLoaded
zdarzeniaPodobny problem miałem z ionic, gdzie próbowałem załadować natywną kamerę zaraz po wybraniu zakładki camera. Rozwiązałem ten problem, ustawiając kontroler na komponent ion-view dla karty kamery (w tabs.html), a następnie wywołując metodę $ scope, która ładuje moją kamerę (addImage).
W 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>
Metoda addImage, zdefiniowana w AddMediaCtrl, ładuje natywną kamerę za każdym razem, gdy użytkownik kliknie kartę „Camera”. I nie , nie trzeba zmieniać niczego w kątowym cache dla tej pracy. Mam nadzieję, że to pomoże.
źródło