Wyczyść historię i załaduj ponownie stronę podczas logowania / wylogowywania za pomocą Ionic Framework

80

Nie mam doświadczenia w tworzeniu aplikacji mobilnych z Ionic. Podczas logowania i wylogowywania muszę ponownie załadować stronę, aby odświeżyć dane, jednak $state.go('mainPage')przenosi użytkownika z powrotem do widoku bez przeładowywania - kontroler za nią nigdy nie jest wywoływany.

Czy istnieje sposób na wyczyszczenie historii i ponowne załadowanie stanu w Ionic?

koło pasowe bez tarcia
źródło

Odpowiedzi:

124

Witamy w frameworku! W rzeczywistości routing w Ionic jest zasilany przez router ui . Prawdopodobnie powinieneś sprawdzić to poprzednie pytanie SO, aby znaleźć kilka różnych sposobów, aby to osiągnąć.

Jeśli chcesz tylko przeładować stan, możesz użyć:

$state.go($state.current, {}, {reload: true});

Jeśli faktycznie chcesz ponownie załadować stronę (tak jak w przypadku, chcesz ponownie załadować wszystko), możesz użyć:

$window.location.reload(true)

Powodzenia!

JimTheDev
źródło
Chcę spakować wszystkie pliki css / js pobrane ze zdalnego serwera w index.html. Ale wolałbym je ponownie załadować tylko wtedy, gdy nastąpiła zmiana. Jak mam to zorganizować?
mylord
Nie jestem pewien, czy rozumiem Cię @mylord. Czy mówisz o przeładowaniu na żywo? Może interesuje Cię pamięć podręczna / manifest offline Html5, jak omówiono tutaj: tmkmobile.wordpress.com/2012/03/04/html5-offline-solution Myślę, że możesz próbować zrobić coś innego niż pierwotny cel pytania.
JimTheDev
13
$ state.go ($ state.current, {}, {reload: true}); to rozwiązanie u mnie nie działa.
IamStalker
@IamStalker Czy możesz podać jakieś dodatkowe informacje lub może przykładowo codepen / fiddle / plunk?
JimTheDev
9
$state.go($state.current, {}, {reload: true});nie działa, jeśli cache:true(co jest wartością domyślną, jeśli pominięto pamięć podręczną) w definicji stanu. Przetestowano w #ionic 1.0.0-RC2 i 1.0.0. Zobacz moją odpowiedź.
ABCD.ca
25

Okazało się, że odpowiedź JimTheDev działa tylko wtedy, gdy została cache:falseustawiona definicja stanu . Dzięki buforowaniu widoku możesz to zrobić, $ionicHistory.clearCache()a następnie, $state.go('app.fooDestinationView')jeśli nawigujesz z jednego stanu do tego, który jest buforowany, ale wymaga odświeżenia.

Zobacz moją odpowiedź tutaj, ponieważ wymaga prostej zmiany na Ionic i utworzyłem żądanie ściągnięcia: https://stackoverflow.com/a/30224972/756177

ABCD.ca
źródło
1
Dobry towar. W rzeczywistości nie używam tego w mojej aplikacji jonowej, więc doceniam kontynuację funkcji buforowania. Wygląda na to, że Twój PR przejdzie do wersji 1.0.1. Kiedy to zostanie opublikowane, zapiszę w moim oryginalnym poście, w którym napisałem o tobie i zachęciłem ludzi do przyjrzenia się.
JimTheDev
18

Poprawna odpowiedź:

$window.location.reload(true);
EpokK
źródło
1
Ta odpowiedź została oznaczona jako niska jakość. Czy mógłbyś spróbować wyjaśnić, dlaczego jest to poprawna odpowiedź?
Jorge Leitao,
1
Ponieważ używa $windowzamiastwindow
EpokK
Masz rację w tym, że jeśli korzystasz ze składni .location.reload, sensowne jest użycie $ window. Zmieniłem odpowiedź powyżej, aby zachować spójność dla przyszłych czytelników. W niektórych przypadkach przydatna może być również składnia $ state.go.
JimTheDev,
Pomogła mi tylko ta odpowiedź, a nie zaznaczona
Michał
Kiedyś podobało mi się to podejście, ale niektórzy zgłaszali, że powoduje ono nieskończoną pętlę przeładowań na niektórych urządzeniach (Android 4.4, Chrome).
Oleg Cheremisin
18

Znalazłem rozwiązanie, które pomogło mi to zrobić. Ustawienie cache-view="false"na ion-viewtagu rozwiązało mój problem.

<ion-view cache-view="false" view-title="My Title!">
  ....
</ion-view>
Rajeshwar
źródło
wyłączenie widoku pamięci podręcznej powoduje znaczną utratę wydajności, należy unikać tej opcji. zamiast tego możesz obsługiwać zdarzenia ionicView. zobacz: stackoverflow.com/questions/25192172/ ...
ezain
@ezain, czy mógłbyś dać mi znać, w jaki sposób wpływa to na wydajność?
Rajeshwar
@Rajeshwar, gdy system pamięci podręcznej jest włączony, Ionic utrzymuje cały DOM wygenerowany przez widok w ukryciu, a gdy następuje zmiana widoku, nie trzeba ponownie obliczać DOM. Jeśli masz ciężki DOM i musisz go generować we wszystkich zmianach przejścia, możesz docenić opóźnienia w animacjach przejścia. Jeśli jedynym powodem wyłączenia pamięci podręcznej jest ponowne załadowanie kontrolera, użyj zdarzeń ionicView.
ezain
@ezain, Jest wiele sposobów zaimplementowania tej funkcji wyłączania pamięci podręcznej. Wypróbowałem prawie wszystkie, nic mi nie pomogło. A ten dał mi to, czego potrzebuję. I nie widzę żadnych opóźnień podczas ładowania tej strony, mimo że jest ona niewielka. Więc wolałem ten sposób niż inne sposoby.
Rajeshwar
11

Ponowne załadowanie strony nie jest najlepszym podejściem.

możesz obsłużyć zdarzenia zmiany stanu w celu ponownego załadowania danych bez ponownego ładowania samego widoku.

Przeczytaj o cyklu życia ionicView tutaj:

http://blog.ionic.io/navigating-the-changes/

i obsłuż zdarzenie beforeEnter w celu ponownego załadowania danych.

$scope.$on('$ionicView.beforeEnter', function(){
  // Any thing you can think of
});
ezain
źródło
Wydaje się, że to najlepsze podejście.
markau
konkretnie można sprawdzić, czy państwo jest z pamięci podręcznej, a jeśli tak, zadzwoń niektóre API, aby ją odświeżyć:$scope.$on('$ionicView.beforeEnter', function(scopes, states) { if (states.fromCache) { ... } }
jakub.g
@ jakub.g jeśli nie chcesz buforować widoku, możesz wyłączyć pamięć podręczną dla tego konkretnego widoku, jest prostsze.
ezain
6

W moim przypadku muszę wyczyścić tylko widok i ponownie uruchomić kontroler. Mogę zrozumieć mój zamiar za pomocą tego fragmentu:

$ionicHistory.clearCache([$state.current.name]).then(function() {
  $state.reload();
}

Pamięć podręczna nadal działa i wygląda na to, że wyczyszczono tylko widok.

ionic --version mówi 1.7.5.

glaucomorais
źródło
Dodatek: Gdy stan ma parametry, należy je zdefiniować w widoku / identyfikacji stanu. Sprawdź ten
plik wklejany
Błędy w kodzie Poprawna wersja $ ionicHistory.clearCache ([$ state.current.name]). Then (function () {$ state.reload ();});
Kirill A
Brakuje tylko nawiasu
użytkownik623396
1

Żadne z wyżej wymienionych rozwiązań nie działało w przypadku nazwy hosta innej niż localhost!

Musiałem dodać notify: false do listy opcji, do których przechodzę $state.go, aby uniknąć wywoływania słuchaczy zmian Angular, zanim $window.location.reloadpołączenie zostanie wywołane. Ostateczny kod wygląda następująco:

$state.go('home', {}, {reload: true, notify: false});

>>> EDYCJA - w zależności od przeglądarki konieczne może być podanie $ timeout >>>

$timeout(function () { $window.location.reload(true); }, 100);

<<< KONIEC EDYCJI <<<

Więcej informacji na ten temat znajdziesz w dokumentacji ui-routera .

Majid Mallis
źródło
0

Próbowałem odświeżyć stronę za pomocą angularjs, kiedy zobaczyłem strony internetowe, pomyliłem się, ale żaden kod nie działał dla kodu, a następnie otrzymałem rozwiązanie do ponownego załadowania strony za pomocą

$state.go('path',null,{reload:true});

użyj tego w funkcji, która będzie działać.

Krishnaraj
źródło
0

Musiałem przeładować stan, aby paski przewijania działały. Nie działały, gdy przekraczały inny stan - „rejestracja”. Jeśli aplikacja została wymuszona po rejestracji i ponownie otwarta, tj. Przeszła bezpośrednio do stanu „początkowego”, paski przewijania działały. Żadne z powyższych rozwiązań nie zadziałało.

Gdy po rejestracji wymieniłem:

$state.go("home");

z

window.location = "index.html"; 

Aplikacja została ponownie załadowana, a paski przewijania działały.

Tom Andraszek
źródło
0

Kontroler jest wywoływany tylko raz i POWINIENEŚ zachować ten model logiczny, co zwykle robię to:

Tworzę metodę $scope.reload(params)

Na początku tej metody dzwonię $ionicLoading.show({template:..}) aby pokazać mój niestandardowy spinner

Po zakończeniu procesu ponownego ładowania mogę zadzwonić $ionicLoading.hide() jako oddzwonienie

Na koniec dodaję wewnątrz przycisku ODŚWIEŻ ng-click = "reload(params)"

Jedynym minusem tego rozwiązania jest utrata systemu historii nawigacji jonowej

Mam nadzieję że to pomoże!

Nourdine Alouane
źródło
0

Jeśli chcesz ponownie załadować po zmianie widoku, musisz

$state.reload('state',{reload:true});

Jeśli chcesz, aby ten widok był nowym „korzeniem”, możesz powiedzieć ionic, że następnym widokiem będzie korzeń

 $ionicHistory.nextViewOptions({ historyRoot: true });
 $state.go('app.xxx');
 return;

Jeśli chcesz, aby kontrolery ładowały się ponownie po każdej zmianie widoku

app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {

$ionicConfigProvider.views.maxCache(0);
EduLopez
źródło
0

.state (url: '/ url', kontroler: Ctl, templateUrl: 'template.html', cache: false) cache: false ==> rozwiązałem mój problem!

Mohammed BOUTCHEKKOUCHT
źródło
0

Jak wskazały kontrolery @ezain przeładowujące tylko wtedy, gdy jest to konieczne. Innym czystszym sposobem aktualizowania danych podczas zmiany stanów, zamiast ponownego ładowania kontrolera, jest wykorzystanie zdarzeń transmisji i nasłuchiwanie takich zdarzeń w kontrolerach, które muszą aktualizować dane w widokach.

Przykład: w funkcjach logowania / wylogowania możesz zrobić coś takiego:

$scope.login = function(){
    //After login logic then send a broadcast
    $rootScope.$broadcast("user-logged-in");
    $state.go("mainPage");
};
$scope.logout = function(){
   //After logout logic then send a broadcast
   $rootScope.$broadcast("user-logged-out");
   $state.go("mainPage");
};

Teraz w kontrolerze mainPage wyzwalaj zmiany w widoku, używając funkcji $ on, aby słuchać transmisji w kontrolerze mainPage w następujący sposób:

$scope.$on("user-logged-in", function(){
     //update mainPage view data here eg. $scope.username = 'John';
});

$scope.$on("user-logged-out", function(){
    //update mainPage view data here eg. $scope.username = '';
});
Dev
źródło
-1

Próbowałem wielu metod, ale stwierdziłem, że ta metoda jest absolutnie poprawna:

$window.location.reload();

Mam nadzieję, że pomoże to innym utknąć na wiele dni, takich jak ja z wersją: kątowa 1.5.5, jonowa 1.2.4, kątowa-ui-router 1.0.0

grabtasker
źródło