Estou com problemas com o cache de parciais no AngularJS.
Na minha página HTML eu tenho:
<body>
<div ng-view></div>
<body>
onde minhas parciais são carregadas.
Quando altero o código HTML no meu parcial, o navegador ainda carrega dados antigos.
Existe alguma solução alternativa?
caching
angularjs
browser-cache
Mennion
fonte
fonte
app.config.update(SEND_FILE_MAX_AGE_DEFAULT=0)
ao meuflask_app.py
. (Eu imagino que coisas semelhantes existam para outros servidores web).Ctrl+Shift+R
(ou seja duro Recarregar) e não importa o mecanismo de cache é cromo utilizado irá ignorá-lo e re-buscar todos os scripts, folhas de estilo etc.ng-include
|ng-view
|templateUrl
não são tratados por este atalhoRespostas:
Para desenvolvimento, você também pode desativar o cache do navegador - Nas Ferramentas de desenvolvimento do Chrome, no canto inferior direito, clique na engrenagem e marque a opção
Atualização: No Firefox, existe a mesma opção no Depurador -> Configurações -> Seção Avançada (marcada para a Versão 33)
Atualização 2: Embora esta opção apareça no Firefox, alguns relatórios não funcionam. Sugiro usar o firebug e seguir a resposta hadaytullah.
fonte
Com base na resposta do @ Valentyn, aqui está uma maneira de sempre limpar automaticamente o cache sempre que o conteúdo do ng-view for alterado:
fonte
Conforme mencionado nas outras respostas, aqui e aqui , o cache pode ser limpo usando:
No entanto, como sugerido por gatoatigrado no comentário , isso parece funcionar apenas se o modelo html foi exibido sem nenhum cabeçalho de cache.
Então, isso funciona para mim:
Em angular:
Você pode adicionar cabeçalhos de cache de várias maneiras, mas aqui estão algumas soluções que funcionam para mim.
Se estiver usando
IIS
, adicione isso ao seu web.config:Se estiver usando o Nginx, você pode adicionar isso à sua configuração:
Editar
Acabei de perceber que a pergunta mencionava a
dev
máquina, mas espero que isso ainda ajude alguém ...fonte
Se você estiver falando sobre o cache usado para armazenar em cache modelos, sem recarregar a página inteira, poderá esvaziá-lo com algo como:
E na marcação:
<button ng-click='clearCache()'>Clear cache</button>
E pressione este botão para limpar o cache.
fonte
Solução para Firefox (33.1.1) usando Firebug (22.0.6)
fonte
Esse trecho me ajudou a me livrar do cache de modelos
Os detalhes do seguinte snippet podem ser encontrados neste link: http://oncodesign.io/2014/02/19/safely-prevent-template-caching-in-angularjs/
fonte
if (!current) { return; }
Estou postando isso apenas para cobrir todas as possibilidades, pois nenhuma das outras soluções funcionou para mim (elas geraram erros devido a dependências do modelo angular-bootstrap, entre outras).
Enquanto estiver desenvolvendo / depurando um modelo específico, você pode garantir que ele sempre atualize incluindo um carimbo de data / hora no caminho, como este:
Observe o final
?nd=' + Date.now()
natemplateUrl
variável.fonte
.value('DEBUG', true)
para ativar ou não essa linha..run(function($rootScope) { $rootScope.DEBUG = true; ...
e, em seguida, dentro da directiva injetar US $ rootScope como.directive('filter', ['$rootScope', function($rootScope)...
e no objeto-propriedade retornado:templateUrl: '/app/components/filter/filter-template.html' + ($rootScope.DEBUG ? '?n=' + Date.now() : '')
. Talvez você possa elaborar sua abordagem .value ('DEBUG', true)? Voto a favor!.value('DEBUG', true
é o mesmo que você fez$rootScope
, mas sem desordená-lo :) Mais tarde, você pode injetarDEBUG
no controlador e consultar como um serviço normal..value(...)
item, se não for muito sofisticado? Suponho que o conceito por trás seja uma melhor prática angular desconhecida para mim.Como já foi dito, derrotar o cache completamente para fins de desenvolvimento pode ser feito facilmente sem alterar o código: use uma configuração do navegador ou um plugin. Fora do dev, para impedir o armazenamento em cache de modelos angulares de modelos baseados em rotas, remova a URL do modelo durante o cache de $ routeChangeStart (ou $ stateChangeStart, para o roteador da interface do usuário), como mostrou Shayan. No entanto, isso NÃO afeta o armazenamento em cache dos modelos carregados pelo ng-include, porque esses modelos não são carregados pelo roteador.
Eu queria poder corrigir qualquer modelo, incluindo os carregados pelo ng-include, na produção e fazer com que os usuários recebessem o hotfix no navegador rapidamente, sem precisar recarregar a página inteira. Também não estou preocupado em derrotar o cache HTTP de modelos. A solução é interceptar todas as solicitações HTTP que o aplicativo faz, ignorar aquelas que não são dos modelos .html do meu aplicativo e adicionar um parâmetro ao URL do modelo que muda a cada minuto. Observe que a verificação de caminho é específica ao caminho dos modelos do seu aplicativo. Para obter um intervalo diferente, altere a matemática do parâmetro ou remova o% completamente para não obter armazenamento em cache.
fonte
Se você estiver usando o roteador da interface do usuário, poderá usar um decorador e atualizar o serviço $ templateFactory e anexar um parâmetro de sequência de consultas ao templateUrl, e o navegador sempre carregará o novo modelo no servidor.
Tenho certeza de que você pode obter o mesmo resultado decorando o método "when" no $ routeProvider.
fonte
Descobri que o método do interceptor HTTP funciona muito bem e permite flexibilidade e controle adicionais. Além disso, você pode bloquear o cache para cada release de produção usando um hash de release como a variável do buster.
Aqui está o que o método dev cachebusting parece usar
Date
.fonte
Aqui está outra opção no Chrome.
Clique F12para abrir as ferramentas do desenvolvedor. Em seguida, Recursos > Armazenamento em Cache > Atualizar Cache .
Eu gosto dessa opção porque não preciso desativar o cache como em outras respostas.
fonte
Não há solução para impedir o cache do navegador / proxy, pois você não pode ter o controle.
A outra maneira de forçar novos conteúdos para seus usuários é renomear o arquivo HTML! Exatamente como https://www.npmjs.com/package/grunt-filerev faz para ativos.
fonte
Atualize o documento a cada 30 segundos:
atributo http-equiv do HTML do w3schools
fonte