Existe uma maneira de fazer o AngularJS carregar parciais no início e não quando necessário?

190

Eu tenho uma configuração de rota como esta:

var myApp = angular.module('myApp', []).
    config(['$routeProvider', function ($routeProvider) {
    $routeProvider.
        when('/landing', {
            templateUrl: '/landing-partial',
            controller: landingController
        }).
        when('/:wkspId/query', {
            templateUrl: '/query-partial',
            controller: queryController
        }).
        otherwise({
            redirectTo: '/landing'
        });
}]);

Quero poder fazer com que o angularjs baixe as parciais no início e não quando solicitado.

É possível?

Ranjith Ramachandra
fonte

Respostas:

270

Sim, existem pelo menos 2 soluções para isso:

  1. Use a scriptdiretiva ( http://docs.angularjs.org/api/ng.directive:script ) para colocar suas parciais no HTML carregado inicialmente
  2. Você também pode preencher $templateCache( http://docs.angularjs.org/api/ng.$templateCache ) do JavaScript, se necessário (possivelmente com base no resultado da $httpchamada)

Se você quiser usar o método (2) para preenchê- $templateCachelo, faça o seguinte:

$templateCache.put('second.html', '<b>Second</b> template');

Obviamente, o conteúdo dos modelos pode vir de uma $httpchamada:

$http.get('third.html', {cache:$templateCache});

Aqui está o mais interessante dessas técnicas: http://plnkr.co/edit/J6Y2dc?p=preview

pkozlowski.opensource
fonte
2
Obrigado pela resposta. Gosto da idéia de cache do modelo, porque não quero colocar coisas em uma tag de script. Como usá-lo? A documentação está ruim. Eu vi o violino em um dos comentários lá. Mas eu quero carregar de um URL.
Ranjith Ramachandra
Atualizou a resposta com base nos comentários
pkozlowski.opensource
4
Às vezes, uso a <script>tag inline juntamente com inclusões do lado do servidor. Isso me permite manter minhas parciais como arquivos separados para fins organizacionais, mas ainda fornece tudo em um documento.
Blazemonger 27/10/2014
2
Você sabe se há um aumento de velocidade na escolha de uma solução versus outra?
Atav32
2
Estou armazenando em cache modelos usando a chamada http, mas o problema é o nome do modelo em cache, por exemplo, o URL: $ http.get ('app / correção / modelos / grupo-correção-tabela.html', {cache: $ templateCache}); e sempre que eu quiser carregar o modelo, eu tenho que usar esse nome feio :( que eu não gosto, assim: <td ng-include = "'app / correção / modelos / grupo-correção-tabela.html' ">
Shilan 02/12/2015
25

Se você usar o Grunt para criar seu projeto, existe um plug-in que montará automaticamente suas parciais em um módulo Angular que inicia $ templateCache. Você pode concatenar este módulo com o restante do seu código e carregar tudo, desde um arquivo na inicialização.

https://npmjs.org/package/grunt-html2js

karlgold
fonte
11
Há também grunt-angular-templatesque faz o mesmo tipo de coisa - npmjs.org/package/grunt-angular-templates - funciona um tratamento
Ben Walding
Isso também funciona para modelos no arquivo de índice? Tenho uma visualização de ng e uma inclusão de ng no meu arquivo de índice e estou tendo problemas para exibir meu aplicativo.
Batman
16

Adicione uma tarefa de construção para concatenar e registrar suas parciais html no Angular $templateCache. ( Esta resposta é uma variante mais detalhada da resposta de karlgold. )

Para o grunhido , use modelos grunhidos-angulares . Para gulp , use gulp-angular-templatecache .

Abaixo estão os snippets de configuração / código para ilustrar.

Exemplo:

ngtemplates: {
  app: {                
    src: ['app/partials/**.html', 'app/views/**.html'],
    dest: 'app/scripts/templates.js'
  },
  options: {
    module: 'myModule'
  }
}

gulpfile.js Exemplo:

var templateCache = require('gulp-angular-templatecache');
var paths = ['app/partials/.html', 'app/views/.html'];

gulp.task('createTemplateCache', function () {
return gulp.src(paths)
    .pipe(templateCache('templates.js', { module: 'myModule', root:'app/views'}))
    .pipe(gulp.dest('app/scripts'));
    });

templates.js (esse arquivo é gerado automaticamente pela tarefa de construção)

$templateCache.put('app/views/main.html', "<div class=\"main\">\r"...

index.html

<script src="app/scripts/templates.js"></script>
<div ng-include ng-controller="main as vm" src="'app/views/main.html'"></div>
James Lawruk
fonte
2
Oi @ James Eu estou usando este plugin gulp. Todo o arquivo .html é carregado corretamente, mas quando tento especificar o html como parte de algum plug-in da caixa de diálogo (estou usando o ng-material), ele lança 404. ex - $ mdDialog.show ({controller: 'entityGridCtrl', templateUrl: 'user / parciais / entityGrid.html '});
Anand
Você substituiu minhas referências de aplicativos / visualizações por seus usuários / parciais?
James Lawruk
THX. Eu não estou mudando caminho de parciais, eu postei a minha pergunta - stackoverflow.com/questions/29399453/...
Anand
11

Se você envolver cada modelo em uma tag de script, por exemplo:

<script id="about.html" type="text/ng-template">
<div>
    <h3>About</h3>
    This is the About page
    Its cool!
</div>
</script>

Concatene todos os modelos em um arquivo grande. Se estiver usando o Visual Studio 2013, faça o download do essencial da Web - ele adiciona um menu com o botão direito do mouse para criar um Pacote HTML.

Adicione o código que esse cara escreveu para alterar o $templatecacheserviço angular - é apenas um pequeno pedaço de código e funciona: Goj de Vojta Jina

É $http.getisso que deve ser alterado para usar seu arquivo de pacote configurável:

allTplPromise = $http.get('templates/templateBundle.min.html').then(

Suas rotas templateUrldevem ficar assim:

        $routeProvider.when(
            "/about", {
                controller: "",
                templateUrl: "about.html"
            }
        );
Simon Dowdeswell
fonte
0

Eu apenas uso ecopara fazer o trabalho para mim. ecoé suportado pelo Sprockets por padrão. É uma abreviação de Embedded Coffeescript que pega um arquivo eco e é compilado em um arquivo de modelo Javascript, e o arquivo será tratado como qualquer outro arquivo js que você possui na sua pasta de ativos.

Tudo o que você precisa fazer é criar um modelo com a extensão .jst.eco e escrever um código html, e os trilhos automaticamente compilarão e servirão o arquivo com o pipeline de ativos, e a maneira de acessar o modelo é realmente fácil: JST['path/to/file']({var: value});onde path/to/fileé baseado no caminho lógico; portanto, se você tiver um arquivo /assets/javascript/path/file.jst.eco, poderá acessar o modelo emJST['path/file']()

Para fazê-lo funcionar com angularjs, você pode passá-lo para o atributo template em vez de templateDir, e ele começará a funcionar magicamente!

Pencilcheck
fonte
Não sei se isso responde à pergunta, e alterar a linguagem de programação provavelmente é um exagero.
Xdhmoore 28/01
0

Você pode passar $ state para o seu controlador e, quando a página carregar e chamar o getter no controlador, você chamará $ state.go ('index') ou qualquer parte parcial que desejar carregar. Feito.

rj905
fonte
-1

Outro método é usar o cache de aplicativos do HTML5 para baixar todos os arquivos uma vez e mantê-los no cache do navegador. O link acima contém muito mais informações. As informações a seguir são do artigo:

Altere sua <html>tag para incluir um manifestatributo:

<html manifest="http://www.example.com/example.mf">

Um arquivo de manifesto deve ser servido com o tipo MIME text/cache-manifest.

Um manifesto simples se parece com isso:

CACHE MANIFEST
index.html
stylesheet.css
images/logo.png
scripts/main.js
http://cdn.example.com/scripts/main.js

Quando um aplicativo está offline, ele permanece em cache até que um dos seguintes itens ocorra:

  1. O usuário limpa o armazenamento de dados do navegador para o seu site.
  2. O arquivo de manifesto é modificado. Nota: atualizar um arquivo listado no manifesto não significa que o navegador irá armazenar em cache novamente esse recurso. O próprio arquivo de manifesto deve ser alterado.
Brent Washburne
fonte
1
Infelizmente esse recurso está obsoleta agora developer.mozilla.org/en-US/docs/Web/HTML/... assim apenas um heads-up, usar essa abordagem em seu próprio risco
preguiçoso Coder
De acordo com o padrão HTML, "Esse recurso está em processo de remoção da plataforma da Web. (Este é um processo longo que leva muitos anos.)" A substituição sugerida, Service Workers, ainda é uma "Tecnologia experimental" a partir de início de 2016. Por enquanto, ainda estou usando o cache de aplicativos porque funciona bem para meus aplicativos.
Brent Washburne