J'avais l'impression qu'Angular réécrirait les URL qui apparaissent dans les attributs href des balises d'ancrage dans les tempaltes, de manière à ce qu'elles fonctionnent en mode html5 ou en mode hashbang. La documentation du service de localisation semble indiquer que la réécriture de lien HTML prend en charge la situation de hachage. Je m'attendrais donc à ce que, lorsqu'ils ne sont pas en mode HTML5, des hachages soient insérés, et en mode HTML5, ils ne le seraient pas.
Cependant, il semble qu'aucune réécriture n'ait lieu. L'exemple suivant ne me permet pas de simplement changer de mode. Tous les liens de l'application doivent être réécrits à la main (ou dérivés d'une variable au moment de l'exécution. Suis-je obligé de réécrire manuellement toutes les URL en fonction du mode?
Je ne vois aucune réécriture d'url côté client en cours dans Angular 1.0.6, 1.1.4 ou 1.1.3. Il semble que toutes les valeurs href doivent être précédées de # / pour le mode hashbang et / pour le mode html5.
Une configuration est-elle nécessaire pour provoquer la réécriture? Est-ce que je lis mal les documents? Faire autre chose de stupide?
Voici un petit exemple:
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>
<body>
<div ng-view></div>
<script>
angular.module('sample', [])
.config(
['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
//commenting out this line (switching to hashbang mode) breaks the app
//-- unless # is added to the templates
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'this is home. go to <a href="https://stackoverflow.com/about"/>about</a>'
});
$routeProvider.when('/about', {
template: 'this is about. go to <a href="https://stackoverflow.com/"/>home</a'
});
}
])
.run();
</script>
</body>
Addendum: en relisant ma question, je vois que j'ai utilisé le terme «réécriture» sans beaucoup de clarté sur qui et quand je voulais faire la réécriture. La question est de savoir comment obtenir Angular pour réécrire les URL lors du rendu des chemins et comment lui faire interpréter les chemins dans le code JS de manière uniforme dans les deux modes. Il ne s'agit pas de savoir comment amener un serveur Web à effectuer une réécriture compatible HTML5 des requêtes.
la source
Réponses:
La documentation n'est pas très claire sur le routage AngularJS. Il parle du mode Hashbang et HTML5. En fait, le routage AngularJS fonctionne selon trois modes:
Pour chaque mode, il existe une classe LocationUrl respective (LocationHashbangUrl, LocationUrl et LocationHashbangInHTML5Url).
Afin de simuler la réécriture d'URL, vous devez en fait définir html5mode sur true et décorer la classe $ sniffer comme suit:
Je vais maintenant expliquer cela plus en détail:
Mode Hashbang
Configuration:
C'est le cas lorsque vous devez utiliser des URL avec des hachages dans vos fichiers HTML comme dans
Dans le navigateur, vous devez utiliser le lien suivant:
http://www.example.com/base/index.html#!/base/path
Comme vous pouvez le voir en mode Hashbang pur, tous les liens dans les fichiers HTML doivent commencer par la base telle que "index.html #!".
Mode HTML5
Configuration:
Vous devez définir la base dans un fichier HTML
Dans ce mode, vous pouvez utiliser des liens sans le # dans les fichiers HTML
Lien dans le navigateur:
Hashbang en mode HTML5
Ce mode est activé lorsque nous utilisons réellement le mode HTML5 mais dans un navigateur incompatible. Nous pouvons simuler ce mode dans un navigateur compatible en décorant le service $ sniffer et en définissant l'historique sur false.
Configuration:
Définissez la base dans un fichier HTML:
Dans ce cas, les liens peuvent également être écrits sans le hachage dans le fichier HTML
Lien dans le navigateur:
la source
$provide
est indéfini?Pour les futurs lecteurs, si vous utilisez Angular 1.6 , vous devez également modifier
hashPrefix
:N'oubliez pas de définir la base dans votre HTML
<head>
:Plus d'informations sur le changelog here.
la source
Cela m'a pris un certain temps à comprendre, c'est ainsi que je l'ai fait fonctionner - Routage ASP WebAPI angulaire sans le # pour le référencement
Ajoutez $ locationProvider.html5Mode (true); à app.config
J'avais besoin d'un certain contrôleur (qui était dans le contrôleur domestique) à ignorer pour le téléchargement d'images, j'ai donc ajouté cette règle à RouteConfig
Dans Global.asax, ajoutez ce qui suit - en vous assurant d'ignorer les chemins de téléchargement des API et des images, laissez-les fonctionner normalement, sinon redirigez tout le reste.
Assurez-vous d'utiliser $ location.url ('/ XXX') et non window.location ... pour rediriger
Référencez les fichiers CSS avec un chemin absolu
et pas
Note finale - cela m'a donné un contrôle total et je n'ai rien eu à faire sur la configuration Web.
J'espère que cela aide car cela m'a pris un certain temps à comprendre.
la source
Je voulais pouvoir accéder à mon application avec le mode HTML5 et un token fixe puis passer à la méthode hashbang (pour conserver le token afin que l'utilisateur puisse actualiser sa page).
URL pour accéder à mon application:
http://myapp.com/amazing_url?token=super_token
Ensuite, lorsque l'utilisateur charge la page:
http://myapp.com/amazing_url?token=super_token#/amazing_url
Ensuite, lorsque l'utilisateur navigue:
http://myapp.com/amazing_url?token=super_token#/another_url
Avec cela, je garde le jeton dans l'URL et conserve l'état lorsque l'utilisateur navigue. J'ai perdu un peu de visibilité de l'URL, mais il n'y a pas de moyen parfait de le faire.
Alors n'activez pas le mode HTML5, puis ajoutez ce contrôleur:
la source