Qual é a maneira correta / aceita de usar folhas de estilo separadas para as várias visualizações que meu aplicativo usa?
Atualmente, estou colocando um elemento de link no html da view / parcial na parte superior, mas me disseram que isso é uma prática ruim, embora todos os navegadores modernos o suportem, mas posso ver por que ele é mal visto.
A outra possibilidade é colocar as folhas de estilo separadas em meus index.html, head
mas eu gostaria que ela carregasse a folha de estilo apenas se sua visualização estivesse sendo carregada em nome do desempenho.
Essa é uma prática ruim, pois o estilo não terá efeito até que o css seja carregado no servidor, levando a um flash rápido de conteúdo não formatado em um navegador lento? Ainda tenho que testemunhar isso, embora esteja testando localmente.
Existe uma maneira de carregar o CSS através do objeto passado para o Angular $routeProvider.when
?
Desde já, obrigado!
fonte
<link>
tags css nesse formato , com o Chrome mais recente, o servidor na minha máquina local (e "Desativar cache" ativado para simular as condições de "primeiro carregamento"). Eu imagino que pré-inserir uma<style>
tag no html parcial no servidor evitaria esse problema.Respostas:
Sei que essa pergunta é antiga agora, mas depois de fazer uma tonelada de pesquisas sobre várias soluções para esse problema, acho que posso ter encontrado uma solução melhor.
Caso alguém no futuro esteja interessado, aqui está o que eu criei:
1. Crie uma diretiva personalizada para o
<head>
elemento:Esta diretiva faz o seguinte:
$compile
) uma string html que cria um conjunto de<link />
tags para cada item noscope.routeStyles
objeto usandong-repeat
eng-href
.<link />
elementos à<head>
tag.$rootScope
para ouvir'$routeChangeStart'
eventos. Para cada'$routeChangeStart'
evento, ele pega o$$route
objeto "atual" (a rota que o usuário está prestes a sair) e remove seus arquivos css parciais específicos da<head>
tag. Ele também pega o "próximo"$$route
objeto (a rota para a qual o usuário está prestes a ir) e adiciona qualquer um dos seus arquivos css parciais específicos à<head>
tag.ng-repeat
parte da<link />
tag compilada lida com a adição e remoção de folhas de estilo específicas da página, com base no que é adicionado ou removido doscope.routeStyles
objeto.Nota: isso requer que seu
ng-app
atributo esteja no<html>
elemento, não em<body>
ou qualquer coisa dentro dele<html>
.2. Especifique quais folhas de estilo pertencem a quais rotas usando o
$routeProvider
:Essa configuração adiciona uma
css
propriedade personalizada ao objeto usado para configurar a rota de cada página. Esse objeto é passado para cada'$routeChangeStart'
evento como.$$route
. Portanto, ao ouvir o'$routeChangeStart'
evento, podemos pegar acss
propriedade que especificamos e anexar / remover essas<link />
tags, conforme necessário. Observe que especificar umacss
propriedade na rota é completamente opcional, pois foi omitida no'/some/route/2'
exemplo. Se a rota não tiver umacss
propriedade, a<head>
diretiva simplesmente não fará nada para essa rota. Observe também que você pode até ter várias folhas de estilo específicas da página por rota, como no'/some/route/3'
exemplo acima, em que acss
propriedade é uma matriz de caminhos relativos às folhas de estilo necessárias para essa rota.3. Você está pronto Essas duas coisas configuram tudo o que é necessário e, na minha opinião, o código mais limpo possível.
Espero que ajude alguém que possa estar lutando com esse problema tanto quanto eu.
fonte
index.html
arquivo. Assim, no exemplo acima,index.html
estaria na raiz e acss
pasta na raiz, contendo todos os arquivos css. mas você pode estruturar seu aplicativo da maneira que desejar, desde que use os caminhos relativos corretos.angular.forEach(current.$$route.css, function(sheet){ delete scope.routeStyles[sheet]; });
.A solução do @ tennisgent é ótima. No entanto, acho que é um pouco limitado.
A modularidade e o encapsulamento no Angular vão além das rotas. Com base na maneira como a web está caminhando para o desenvolvimento baseado em componentes, é importante aplicar isso também nas diretivas.
Como você já sabe, no Angular podemos incluir modelos (estrutura) e controladores (comportamento) em páginas e componentes. O AngularCSS permite a última peça que falta: anexar folhas de estilo (apresentação).
Para uma solução completa, sugiro usar o AngularCSS.
ng-app
na<html>
tag. Isso é importante quando você tem vários aplicativos em execução na mesma páginahttps://github.com/door3/angular-css
aqui estão alguns exemplos:
Rotas
Diretivas
Além disso, você pode usar o
$css
serviço para casos extremos:Você pode ler mais sobre o AngularCSS aqui:
http://door3.com/insights/introducing-angularcss-css-demand-angularjs
fonte
Pode acrescentar uma nova folha de estilo à cabeça
$routeProvider
. Para simplificar, estou usando uma string, mas também poderia criar um novo elemento de link ou criar um serviço para folhas de estiloO maior benefício da pré-codificação na página é que já existem imagens de plano de fundo e menor probabilidade de
FOUC
fonte
<link>
no<head>
do index.html estaticamente, embora?when
for da rota não tiver sido chamado. Pode colocar esse código emcontroller
retorno de chamada dewhen
dentro dorouteProvider
, ou talvez dentro deresolve
callback que gatilhos prováveis mais cedorouteprovider
... que o comentário era sobre incluí-lo na cabeça da página quando a página é servido@ sz3, engraçado o suficiente hoje, eu tive que fazer exatamente o que você estava tentando alcançar: ' carregar um arquivo CSS específico somente quando um usuário acessar ' uma página específica. Então, eu usei a solução acima.
Mas estou aqui para responder à sua última pergunta: ' onde exatamente devo colocar o código. Alguma idéia ?
Você estava certo ao incluir o código na resolução , mas precisa alterar um pouco o formato.
Dê uma olhada no código abaixo:
Acabei de testar e está funcionando bem , ele injeta o html e carrega meu 'home.css' somente quando eu bati na rota '/ home'.
Uma explicação completa pode ser encontrada aqui , mas basicamente resolva: deve obter um objeto no formato
Você pode nomear a ' chave ' como quiser - no meu caso, chamei de ' estilo '.
Então, para o valor, você tem duas opções:
Se for uma sequência , é um alias para um serviço.
Se for função , será injetado e o valor de retorno será tratado como dependência.
O ponto principal aqui é que o código dentro da função será executado antes que o controlador seja instanciado e o evento $ routeChangeSuccess seja acionado.
Espero que ajude.
fonte
Perfeito, obrigado!! Só tive que fazer alguns ajustes para fazê-lo funcionar com o ui-router:
fonte
Se você só precisa que seu CSS seja aplicado a uma visão específica, estou usando este trecho útil dentro do meu controlador:
Isso adicionará uma classe à minha
body
tag quando o estado for carregado e a removerá quando o estado for destruído (ou seja, alguém muda de página). Isso resolve meu problema relacionado de precisar apenas que o CSS seja aplicado a um estado no meu aplicativo.fonte
'use strict'; angular.module ('app') .run (['$ rootScope', '$ state', '$ stateParams', função ($ rootScope, $ state, $ stateParams) {$ rootScope. $ state = $ state; $ rootScope . $ stateParams = $ stateParams;}]) .config (['$ stateProvider', '$ urlRouterProvider', função ($ stateProvider, $ urlRouterProvider) {
fonte