Je migre mon application basée sur AngularJS pour utiliser ui-router au lieu du routage intégré. Je l'ai configuré comme indiqué ci-dessous
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('home', {
url: '/home',
templateUrl : 'views/home.html',
data : { pageTitle: 'Home' }
})
.state('about', {
url: '/about',
templateUrl : 'views/about.html',
data : { pageTitle: 'About' }
})
});
Comment puis-je utiliser la variable pageTitle pour définir dynamiquement le titre de la page? En utilisant le routage intégré, je pourrais faire
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
$rootScope.pageTitle = $route.current.data.pageTitle;
});
puis liez la variable en HTML comme indiqué ci-dessous
<title ng-bind="$root.pageTitle"></title>
Y a-t-il un événement similaire auquel je peux me connecter en utilisant ui-router? J'ai remarqué qu'il existe des fonctions «onEnter» et «onExit», mais elles semblent être liées à chaque état et m'obligeront à répéter le code pour définir la variable $ rootScope pour chaque état.
Réponses:
Utilisez
$stateChangeSuccess
.Vous pouvez le mettre dans une directive:
Et:
Démo: http://run.plnkr.co/8tqvzlCw62Tl7t4j/#/home
Code: http://plnkr.co/edit/XO6RyBPURQFPodoFdYgX?p=preview
Même avec
$stateChangeSuccess
le$timeout
a été nécessaire pour que l'histoire soit correcte, du moins quand je me suis testé.Edit: 24 novembre 2014 - Approche déclarative:
Et:
Démo: http://run.plnkr.co/d4s3qBikieq8egX7/#/credits
Code: http://plnkr.co/edit/NpzQsxYGofswWQUBGthR?p=preview
la source
element.text(title)
appel dans un délai d'attente $ a fonctionné pour moi. Modification du message d'origine.resolve
pour le générer, puis accéder à la valeur "résolue" pendant l'événement $ stateChangeSuccess avec:$state.$current.locals.resolve.$$values.NAME_OF_RESOLVE_FUNCTION
.Il existe une autre façon de faire cela en combinant déjà la plupart des réponses ici. Je sais que cela a déjà été répondu, mais je voulais montrer comment je change dynamiquement les titres de page avec ui-router.
Si vous jetez un œil à l' exemple d'application ui-router , ils utilisent le bloc angulaire .run pour ajouter la variable $ state à $ rootScope.
Avec cette définition, vous pouvez facilement mettre à jour dynamiquement le titre de votre page avec ce que vous avez publié mais modifié pour utiliser l'état défini:
Configurez l'état de la même manière:
Mais modifiez un peu le html ...
Je ne peux pas dire que ce soit mieux que les réponses précédentes ... mais c'était plus facile pour moi à comprendre et à mettre en œuvre. J'espère que cela aide quelqu'un!
la source
$state
et$stateParams
à l'$rootScope
intérieurrun
.Le plugin angular-ui-router-title facilite la mise à jour du titre de la page avec une valeur statique ou dynamique en fonction de l'état actuel. Il fonctionne également correctement avec l'historique du navigateur.
la source
$stateChangeSuccess
est désormais obsolète dans UI-Router 1.x et désactivé par défaut. Vous devrez maintenant utiliser le nouveau$transition
service.Une solution n'est pas trop difficile une fois que vous comprenez comment
$transition
fonctionne. J'ai de l' aide de @troig pour tout comprendre. Voici ce que j'ai proposé pour mettre à jour le titre.Mettez ceci dans votre application Angular 1.6. Notez que j'utilise la syntaxe ECMAScript 6; si vous ne l'êtes pas, vous devrez par exemple passer
let
àvar
.Ensuite, ajoutez simplement une
title
chaîne à votre état:Cela fera apparaître les mots "Foo Page" dans le titre. (Si un état n'a pas de titre, le titre de la page ne sera pas mis à jour. Ce serait une chose simple de mettre à jour le code ci-dessus pour fournir un titre par défaut si un état ne l'indique pas.)
Le code vous permet également d'utiliser une fonction pour
title
. Lethis
utilisé pour appeler la fonction sera l'état lui-même, et le seul argument sera les paramètres d'état, comme cet exemple:Pour le chemin de l'URL
/bar/code/123
qui afficherait «Code à barres 123» comme titre de la page. Notez que j'utilise la syntaxe ECMAScript 6 pour formater la chaîne et extraireparams.code
.Ce serait bien si quelqu'un qui en avait le temps mettait quelque chose comme ça dans une directive et la publiait pour que tout le monde l'utilise.
la source
data
objet pour les clés personnalisées.title
n'existe pas sur l'StateDeclaration
interface.Attacher $ state à $ rootscope pour l'utiliser n'importe où dans l'application.
la source
J'ai trouvé ce moyen très simple:
puis dans mon HTML comme ceci:
la source
Mettez simplement à jour window.document.title:
De cette façon, «ng-app» n'a pas besoin de se déplacer vers la balise HTML et peut rester sur le corps ou plus bas.
la source
J'utilise ngMeta , qui fonctionne bien non seulement pour définir le titre de la page, mais également pour les descriptions. Il vous permet de définir un titre / une description spécifique pour chaque état, les valeurs par défaut lorsqu'un titre / une description n'est pas spécifié, ainsi que les suffixes de titre par défaut (c'est-à-dire «| MySiteName») et la valeur de l'auteur.
la source
Vous êtes en fait très proche de votre première réponse / question. Ajoutez votre titre en tant qu'objet de données:
Dans votre index.html, liez les données directement au titre de la page:
la source
Je me suis retrouvé avec cette combinaison des réponses de Martin et tasseKATT - simple et sans aucun élément lié au modèle:
la source
Pourquoi pas simplement:
MISE À JOUR: Code de directive complet
Ensuite, dans chaque page, vous incluez simplement cette directive:
la source
Si vous utilisez ES6, cela fonctionne très bien :).
la source
Vous pouvez peut-être essayer cette directive.
https://github.com/afeiship/angular-dynamic-title
Voici l'exemple:
html:
javascript:
la source
Pour les versions d'UI-Router 1.0.0+ mises à jour, ( https://ui-router.github.io/guide/ng1/migrate-to-1_0 )
Reportez-vous au code suivant
Ajoutez ce qui suit à votre index.html:
la source