AngularJS confirme avant le changement de route
Est-il possible d'écouter les changements de route ET de onwindowunload à la fois pour confirmer la page de quitter sans enregistrer les modifications?
Cas d'utilisation:
- Utilisateur clique sur Retour
- Utilisateur appuie sur le bouton retour dans le navigateur
- L'utilisateur tape une URL différente
Si l'utilisateur clique sur "annuler" stop à la page /changement d'itinéraire.
J'ai vu quelques exemples différents mais aucun n'a fonctionné tout à fait raison.
source d'informationauteur amcdnl
Vous devez vous connecter pour publier un commentaire.
Démo: http://plnkr.co/edit/Aq8uYg
Dans la démo, si vous modifiez la valeur de l'entrée, vous serez remarqué lorsque vous essayez de revenir en arrière.
Écouter
$locationChangeStart
et l'utilisationevent.preventDefault()
pour annuler le changement d'emplacement si des modifications ne sont pas confirmées.Cette méthode a un avantage sur
$route.reload()
: régulateur de courant et de modèles, il ne sera pas instancié. ainsi, tous vos variables sont identiques utilisateur, cliquez sur le bouton "Retour".Vous trouverez les
$locationChangeStart
est un événement que vous pouvez écouter pour détecter un changement d'itinéraire.Essayer quelque chose comme
$route.reload()
permettra d'éviter le changement d'itinéraire.La distinction entre l'utilisateur a cliqué sur le dos ou la modification de l'url etc ne fera pas une différence. Comme les navigateurs ne pas recharger toute les ressources lorsque vous modifiez l'url passée la
#
tout est encore contenue dans votre angulaire de la logique. Cela signifie que toutes ces méthodes devraient déclencher la$locationChangeStart
événement.@Jon a souligné que la
$route
service va certainement vous être utiles. le.reload()
méthode permettra d'éviter le changement d'itinéraire à partir de la fin mais il ya beaucoup plus que vous pouvez faire avec le$route
service si vous examinez - voir la documentation.Je voudrais simplement mettre à jour une propriété sur votre $rootScope comme
hasUnsavedEdits
.Vous pourriez avoir à modifier un peu le code pour gérer à la fois les conditions. Voir démo pour plus de détails.
C'est aussi joli lien
http://weblogs.asp.net/dwahlin/cancelling-route-navigation-in-angularjs-controllers
J'ai créé le service qui intègre des informations fournies dans les autres réponses (CoffeeScript, voir Plunker ):
Il est basé sur angular-ui-router (utilisation de la
$state
service). Lorsque votre site web entre dans l'état dans lequel les données peuvent être perdues, vous devez appelerLorsqu'il existe un état (c'est à dire l'utilisateur enregistre les données), vous devez appeler:
Par défaut, avertissement apparaîtra sur la modification de l'état ou de la page fermer (c'est à dire d'actualisation ou d'aller à un autre site web). Vous pouvez aussi avoir besoin de vérifier s'il est sûr d'en exécuter une autre actions (par exemple, ne se déconnecte pas avec XHR si il y a des modifications non enregistrées):
J'ai créé un Plunker qu'il simule.
Angulaire ES6 Utilisateurs