¿Cuál es la forma correcta / aceptada de usar hojas de estilo separadas para las diversas vistas que usa mi aplicación?
Actualmente estoy colocando un elemento de enlace en el html de view / partial en la parte superior, pero me han dicho que es una mala práctica, aunque todos los navegadores modernos lo admiten, pero puedo ver por qué está mal visto.
La otra posibilidad es colocar las hojas de estilo separadas en mis index.html, head
pero me gustaría que solo cargara la hoja de estilo si su vista se carga en nombre del rendimiento.
¿Es esta una mala práctica ya que el estilo no tendrá efecto hasta después de que se cargue el CSS desde el servidor, lo que provocará un destello rápido de contenido sin formato en un navegador lento? Todavía tengo que presenciar esto, aunque lo estoy probando localmente.
¿Hay alguna manera de cargar el CSS a través del objeto pasado a Angular's $routeProvider.when
?
¡Gracias por adelantado!
fuente
<link>
etiquetas css en este formato , con el último Chrome, el servidor en mi máquina local (y "Desactivar caché" para simular condiciones de "primera carga"). Me imagino que la inserción previa de una<style>
etiqueta en el html parcial en el servidor evitaría este problema.Respuestas:
Sé que esta pregunta es antigua ahora, pero después de investigar un montón sobre varias soluciones a este problema, creo que podría haber encontrado una mejor solución.
En caso de que alguien en el futuro esté interesado, esto es lo que se me ocurrió:
1. Cree una directiva personalizada para el
<head>
elemento:Esta directiva hace lo siguiente:
$compile
) una cadena html que crea un conjunto de<link />
etiquetas para cada elemento delscope.routeStyles
objeto usandong-repeat
yng-href
.<link />
elementos a la<head>
etiqueta.$rootScope
para escuchar'$routeChangeStart'
eventos. Para cada'$routeChangeStart'
evento, toma el$$route
objeto "actual" (la ruta que el usuario está a punto de abandonar) y elimina sus archivos css específicos parciales de la<head>
etiqueta. También toma el "siguiente"$$route
objeto (la ruta a la que va a ir el usuario) y agrega cualquiera de sus archivos css específicos parciales a<head>
etiqueta.ng-repeat
parte de la<link />
etiqueta compilada maneja todas las adiciones y eliminaciones de las hojas de estilo específicas de la página en función de lo que se agrega o elimina delscope.routeStyles
objeto.Nota: esto requiere que su
ng-app
atributo esté en el<html>
elemento, no en el elemento<body>
o dentro de él<html>
.2. Especifique qué hojas de estilo pertenecen a qué rutas utilizando
$routeProvider
:Esta configuración agrega una
css
propiedad personalizada al objeto que se utiliza para configurar la ruta de cada página. Ese objeto se pasa a cada'$routeChangeStart'
evento como.$$route
. Entonces, al escuchar el'$routeChangeStart'
evento, podemos tomar lacss
propiedad que especificamos y agregar / eliminar esas<link />
etiquetas según sea necesario. Tenga en cuenta que especificar unacss
propiedad en la ruta es completamente opcional, ya que se omitió en el'/some/route/2'
ejemplo. Si la ruta no tiene unacss
propiedad, la<head>
directiva simplemente no hará nada por esa ruta. Tenga en cuenta también que incluso puede tener varias hojas de estilo específicas de la página por ruta, como en el'/some/route/3'
ejemplo anterior, donde lacss
propiedad es una matriz de rutas relativas a las hojas de estilo necesarias para esa ruta.3. Has terminado Esas dos cosas configuran todo lo que se necesitaba y lo hace, en mi opinión, con el código más limpio posible.
Espero que ayude a alguien más que pueda estar luchando con este problema tanto como yo.
fuente
index.html
archivo. Entonces, en el ejemplo anterior,index.html
estaría en la raíz y lacss
carpeta estaría en la raíz, que contiene todos los archivos css. pero puede estructurar su aplicación como desee, siempre que use las rutas relativas correctas.angular.forEach(current.$$route.css, function(sheet){ delete scope.routeStyles[sheet]; });
.La solución de @ tennisgent es excelente. Sin embargo, creo que es un poco limitado.
La modularidad y la encapsulación en angular van más allá de las rutas. Según la forma en que la web avanza hacia el desarrollo basado en componentes, también es importante aplicar esto en las directivas.
Como ya sabe, en Angular podemos incluir plantillas (estructura) y controladores (comportamiento) en páginas y componentes. AngularCSS habilita la última pieza que falta: adjuntar hojas de estilo (presentación).
Para una solución completa, sugiero usar AngularCSS.
ng-app
en la<html>
etiqueta. Esto es importante cuando tienes múltiples aplicaciones ejecutándose en la misma páginahttps://github.com/door3/angular-css
Aquí hay unos ejemplos:
Rutas
Directivas
Además, puede usar el
$css
servicio para casos extremos:Puede leer más sobre AngularCSS aquí:
http://door3.com/insights/introducing-angularcss-css-demand-angularjs
fuente
Podría agregar una nueva hoja de estilo para encabezar dentro
$routeProvider
. Para simplificar, estoy usando una cadena pero también podría crear un nuevo elemento de enlace, o crear un servicio para hojas de estiloEl mayor beneficio de prelaoding en la página es que las imágenes de fondo ya existirán, y menos posibilidades de
FOUC
fuente
<link>
de la<head>
de la index.html estáticamente, sin embargo?when
no se ha llamado a la ruta. Puede poner este código encontroller
devolución de llamada dewhen
dentro delrouteProvider
, o tal vez dentro deresolve
devolución de llamada que probablemente los factores desencadenantes más prontorouteprovider
... ese comentario fue sobre incluirlo en la cabecera de la página principal cuando se@ sz3, lo suficientemente divertido hoy tuve que hacer exactamente lo que intentabas lograr: ' cargar un archivo CSS específico solo cuando un usuario accede ' a una página específica. Entonces utilicé la solución anterior.
Pero estoy aquí para responder a su última pregunta: '¿ dónde exactamente debo poner el código? Algunas ideas ?
Tenías razón al incluir el código en la resolución , pero debes cambiar un poco el formato.
Echa un vistazo al siguiente código:
Acabo de probar y funciona bien , inyecta el html y carga mi 'home.css' solo cuando llego a la ruta '/ home'.
La explicación completa se puede encontrar aquí , pero básicamente resuelva: debería obtener un objeto en el formato
Puedes nombrar la ' clave ' como quieras, en mi caso llamé ' estilo '.
Entonces, para el valor, tiene dos opciones:
Si es una cadena , es un alias para un servicio.
Si es función , entonces se inyecta y el valor de retorno se trata como la dependencia.
El punto principal aquí es que el código dentro de la función se ejecutará antes de que se instancia el controlador y se active el evento $ routeChangeSuccess.
Espero que ayude.
fuente
¡¡Increíble gracias!! Solo tuve que hacer algunos ajustes para que funcione con ui-router:
fuente
Si solo necesita que su CSS se aplique a una vista específica, estoy usando este fragmento útil dentro de mi controlador:
Esto agregará una clase a mi
body
etiqueta cuando se carga el estado y la eliminará cuando se destruya el estado (es decir, alguien cambia de página). Esto resuelve mi problema relacionado de solo necesitar CSS para ser aplicado a un estado en mi aplicación.fuente
'uso estricto'; angular.module ('app') .run (['$ rootScope', '$ state', '$ stateParams', function ($ rootScope, $ state, $ stateParams) {$ rootScope. $ state = $ state; $ rootScope . $ stateParams = $ stateParams;}]) .config (['$ stateProvider', '$ urlRouterProvider', function ($ stateProvider, $ urlRouterProvider) {
fuente