Estoy migrando mi aplicación basada en AngularJS para usar ui-router en lugar del enrutamiento integrado. Lo tengo configurado como se muestra a continuación
.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' }
})
});
¿Cómo puedo usar la variable pageTitle para establecer dinámicamente el título de la página? Usando el enrutamiento integrado, podría hacer
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
$rootScope.pageTitle = $route.current.data.pageTitle;
});
y luego enlazar la variable en HTML como se muestra a continuación
<title ng-bind="$root.pageTitle"></title>
¿Hay un evento similar al que pueda conectarme usando ui-router? Me di cuenta de que hay funciones 'onEnter' y 'onSalir', pero parecen estar vinculadas a cada estado y requerirán que repita el código para establecer la variable $ rootScope para cada estado.
Respuestas:
Utilice
$stateChangeSuccess
.Puedes ponerlo en una directiva:
Y:
Demostración: http://run.plnkr.co/8tqvzlCw62Tl7t4j/#/home
Código: http://plnkr.co/edit/XO6RyBPURQFPodoFdYgX?p=preview
Incluso con
$stateChangeSuccess
el$timeout
ha sido necesario para que el historial sea correcto, al menos cuando me he puesto a prueba.Edición: 24 de noviembre de 2014 - Enfoque declarativo:
Y:
Demostración: http://run.plnkr.co/d4s3qBikieq8egX7/#/credits
Código: http://plnkr.co/edit/NpzQsxYGofswWQUBGthR?p=preview
fuente
element.text(title)
llamada en un $ timeout funcionó para mí. Editando la publicación original.resolve
generarla, a continuación, acceder al valor "resuelto" durante el evento de $ stateChangeSuccess con:$state.$current.locals.resolve.$$values.NAME_OF_RESOLVE_FUNCTION
.Hay otra forma de hacer esto combinando la mayoría de las respuestas aquí. Sé que esto ya está respondido, pero quería mostrar la forma en que cambio dinámicamente los títulos de las páginas con ui-router.
Si echa un vistazo a la aplicación de muestra ui-router , usan el bloque angular .run para agregar la variable $ state a $ rootScope.
Con esto definido, puede actualizar fácilmente y dinámicamente el título de su página con lo que ha publicado pero modificado para usar el estado definido:
Configure el estado de la misma manera:
Pero edite un poco el html ...
No puedo decir que esto sea mejor que las respuestas anteriores ... pero fue más fácil de entender e implementar para mí. ¡Espero que esto ayude a alguien!
fuente
$state
y$stateParams
el$rootScope
de dentrorun
.El complemento angular-ui-router-title facilita la actualización del título de la página a un valor estático o dinámico según el estado actual. También funciona correctamente con el historial del navegador.
fuente
$stateChangeSuccess
ahora está en desuso en UI-Router 1.xy deshabilitado por defecto. Ahora deberá utilizar el nuevo$transition
servicio.Una solución no es demasiado difícil una vez que comprende cómo
$transition
funciona. Recibí ayuda de @troig para entenderlo todo. Esto es lo que se me ocurrió para actualizar el título.Pon esto en tu aplicación Angular 1.6. Tenga en cuenta que estoy usando la sintaxis ECMAScript 6; si no es así, necesitará, por ejemplo, cambiar
let
avar
.Luego simplemente agregue una
title
cadena a su estado:Eso hará que las palabras "Foo Page" aparezcan en el título. (Si un estado no tiene título, el título de la página no se actualizará. Sería muy sencillo actualizar el código anterior para proporcionar un título predeterminado si un estado no indica uno).
El código también le permite usar una función para
title
. Elthis
usado para llamar a la función será el estado mismo, y el único argumento serán los parámetros de estado, como este ejemplo:Para la ruta de URL
/bar/code/123
que mostraría "Código de barras 123" como título de la página. Tenga en cuenta que estoy usando la sintaxis ECMAScript 6 para formatear la cadena y extraerlaparams.code
.Sería bueno si alguien que tuviera tiempo pusiera algo como esto en una directiva y lo publicara para que todos lo usen.
fuente
data
objeto para claves personalizadas.title
no existe en laStateDeclaration
interfaz.Adjuntando $ state a $ rootscope para usar en cualquier lugar de la aplicación.
fuente
Encontré esta forma realmente fácil:
y luego en mi HTML así:
fuente
Simplemente actualice window.document.title:
De esa manera, 'ng-app' no necesita subir a la etiqueta HTML y puede permanecer en el cuerpo o más abajo.
fuente
Estoy usando ngMeta , que funciona bien no solo para configurar el título de la página, sino también para las descripciones. Le permite establecer un título / descripción específico para cada estado, valores predeterminados para cuando no se especifica un título / descripción, así como los sufijos de título predeterminados (es decir, '| MySiteName') y el valor del autor.
fuente
En realidad, estás muy cerca de tu primera respuesta / pregunta. Agregue su título como un objeto de datos:
En su index.html, vincule los datos directamente al título de la página:
fuente
Terminé con esta combinación de las respuestas de Martin y tasseKATT, simple y sin ningún material relacionado con la plantilla:
fuente
Por qué no solo:
ACTUALIZACIÓN: Código de directiva completo
Luego, en cada página, solo incluiría esta directiva:
fuente
Si está utilizando ES6, esto funciona bien :).
fuente
Quizás puedas probar esta directiva.
https://github.com/afeiship/angular-dynamic-title
Aquí está el ejemplo:
html:
javascript:
fuente
Para las versiones actualizadas de UI-Router 1.0.0+, ( https://ui-router.github.io/guide/ng1/migrate-to-1_0 )
Consulte el siguiente código
Agregue lo siguiente a su index.html:
fuente