Effacer l'Historique et Recharger la Page Connexion/Déconnexion à l'Aide Ionique Cadre
je suis nouvelle dans le développement d'applications mobiles avec Ionique. Lors de la connexion et de la déconnexion, je dois recharger la page, afin de rafraîchir les données, cependant, $state.go('mainPage')
ramène l'utilisateur à la vue sans recharger - le contrôleur derrière elle n'est jamais invoquée.
y a-t-il un moyen de clarifier l'histoire et de recharger L'état en ionique?
14 réponses
Bienvenue à la cadre de! En fait, le routage dans Ionic est alimenté par ui-router . Vous devriez probablement vérifier cette question SO précédente pour trouver un couple de différentes façons d'accomplir ceci.
si vous voulez simplement recharger l'état vous pouvez utiliser:
$state.go($state.current, {}, {reload: true});
Si vous voulez recharger la page (comme dans, vous voulez re-bootstrap tout) alors vous pouvez utiliser:
$window.location.reload(true)
bonne chance!
j'ai trouvé que la réponse de JimTheDev ne fonctionnait que lorsque la définition de l'État avait cache:false
ensemble. Avec la vue en cache, vous pouvez faire $ionicHistory.clearCache()
et ensuite $state.go('app.fooDestinationView')
si vous naviguez d'un État à l'autre qui est en cache mais a besoin de rafraîchissement.
voir ma réponse ici car il exige un changement simple à ionique et j'ai créé une demande de traction: https://stackoverflow.com/a/30224972/756177
j'ai trouvé une solution qui m'a aidé à le faire. Mettre cache-view="false"
sur ion-view
a résolu mon problème.
<ion-view cache-view="false" view-title="My Title!">
....
</ion-view>
rechargez la page n'est pas la meilleure approche.
vous pouvez gérer les événements de changement d'État pour recharger les données sans recharger la vue elle-même.
lire sur ionicView cycle de vie ici:
http://blog.ionic.io/navigating-the-changes /
et gérer l'événement avant de recharger les données.
$scope.$on('$ionicView.beforeEnter', function(){
// Any thing you can think of
});
dans mon cas, je dois juste effacer la vue et redémarrer le contrôleur. Je pourrais obtenir mon intention avec cet extrait:
$ionicHistory.clearCache([$state.current.name]).then(function() {
$state.reload();
}
le cache fonctionne toujours et semble que seule la vue est effacée.
ionic --version
dit 1.7.5.
aucune des solutions mentionnées ci-dessus ne fonctionnait pour un nom d'hôte différent de localhost
!
j'ai dû ajouter notify: false
à la liste des options que je passe à $state.go
, pour éviter d'appeler les auditeurs de changement angulaire, avant que l'appel $window.location.reload
soit appelé. Le code Final ressemble à:
$state.go('home', {}, {reload: true, notify: false});
>>> MODIFIER - $timeout peut être nécessaire en fonction de votre navigateur > > >
$timeout(function () {
$window.location.reload(true);
}, 100);
< < FIN DE L'ÉDITION < < <
pour en savoir plus sur ui-référence routeur .
j'essayais de rafraîchir la page en utilisant angularjs quand j'ai vu des sites Web j'ai été confus mais aucun code ne fonctionnait pour le code puis j'ai obtenu la solution pour recharger la page en utilisant
$state.go('path',null,{reload:true});
utiliser cette fonction.
j'avais besoin de recharger l'État pour faire fonctionner les barres de défilement. Ils n'ont pas fonctionné en passant par un autre État - "enregistrement". Si l'application a été fermée de force après l'enregistrement et a ouvert à nouveau, c'est-à-dire qu'elle est allée directement à l'état "d'origine", les barres de défilement ont fonctionné. Aucune des solutions ci-dessus n'a fonctionné.
après l'enregistrement, j'ai remplacé:
$state.go("home");
avec
window.location = "index.html";
L'application rechargé, et les barres de défilement travaillé.
le contrôleur est appelé une seule fois, et vous devez préserver ce modèle logique, ce que je fais habituellement est:
je crée une méthode $scope.reload(params)
au début de cette méthode j'appelle $ionicLoading.show({template:..})
pour montrer mon spinner personnalisé
quand le processus de rechargement de may est terminé, je peux appeler $ionicLoading.hide()
comme un callback
enfin, à L'intérieur du bouton Rafraîchir, j'ajoute ng-click = "reload(params)"
le seul inconvénient de cette solution est que vous perdez le système ionique d'histoire de navigation
Espérons que cette aide!
si vous voulez recharger après le changement de vue, vous devez
$state.reload('state',{reload:true});
si vous voulez faire de cette vue la nouvelle "racine", vous pouvez dire ionic que la prochaine vue, il va être la racine
$ionicHistory.nextViewOptions({ historyRoot: true });
$state.go('app.xxx');
return;
si vous voulez faire recharger vos controllers après chaque changement de vue
app.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
$ionicConfigProvider.views.maxCache(0);
.de l'état(url: '/url', contrôleur: Ctl, templateUrl: 'modèle.html', cache: false) cache: false ==> résolu mon problème !
comme l'a souligné @ezain recharger les contrôleurs seulement quand c'est nécessaire. Une autre façon plus propre de mettre à jour les données lors d'un changement d'état plutôt que de recharger le contrôleur est d'utiliser des événements de diffusion et d'écouter de tels événements dans les contrôleurs qui ont besoin de mettre à jour les données sur les vues.
exemple: dans vos fonctions login / logout vous pouvez faire quelque chose comme cela:
$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");
};
maintenant dans votre controller page principale changements dans la vue en utilisant la fonction $on pour écouter la diffusion dans le contrôleur mainPage comme suit:
$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 = '';
});
j'ai essayé plusieurs méthodes, mais j'ai trouvé que cette méthode est absolument correcte:
$window.location.reload();
espérons que cette aide d'autres coincé pendant des jours comme moi avec la version: angulaire 1.5.5, ionique 1.2.4, angulaire-ui-routeur 1.0.0