Apakah ada cara untuk membuat AngularJS memuat parsial di awal dan tidak di saat dibutuhkan?


190

Saya memiliki pengaturan rute seperti ini:

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'
        });
}]);

Saya ingin dapat membuat angular untuk mengunduh parsial di awal dan bukan saat diminta.

Apa itu mungkin?

Jawaban:


270

Ya, setidaknya ada 2 solusi untuk ini:

  1. Gunakan scriptarahan ( http://docs.angularjs.org/api/ng.directive:script ) untuk meletakkan parsial Anda di HTML yang awalnya dimuat
  2. Anda juga dapat mengisi $templateCache( http://docs.angularjs.org/api/ng.$templateCache ) dari JavaScript jika diperlukan (mungkin berdasarkan hasil $httppanggilan)

Jika Anda ingin menggunakan metode (2) untuk mengisi, $templateCacheAnda dapat melakukannya seperti ini:

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

Tentu saja konten template dapat berasal dari $httppanggilan:

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

Berikut adalah teknik-teknik tersebut: http://plnkr.co/edit/J6Y2dc?p=preview


2
Terima kasih balasannya. Saya suka Ide cache cache karena saya tidak ingin memasukkan sesuatu ke tag skrip. Bagaimana cara menggunakannya? Dokumentasi buruk. Saya melihat biola di salah satu komentar di sana. Tapi saya ingin memuat dari url.
Ranjith Ramachandra

Diperbarui jawabannya berdasarkan komentar
pkozlowski.opensource

4
Saya terkadang menggunakan <script>tag inline bersama dengan server-side include. Ini memungkinkan saya menyimpan sebagian saya sebagai file terpisah untuk tujuan organisasi, tetapi tetap memberikan semuanya dalam satu dokumen.
Blazemonger

2
Apakah Anda tahu jika ada peningkatan kecepatan dalam memilih satu solusi vs solusi lainnya?
Atav32

2
Saya membuat cache templat menggunakan panggilan http, tetapi masalahnya adalah nama templat yang di-cache akan menjadi url forexample: $ http.get ('app / koreksi / templat / grup-koreksi-table.html', {cache: $ templateCache}); dan kemudian setiap kali saya ingin memuat template saya harus menggunakan nama jelek ini :( yang saya tidak suka, Seperti ini: <td ng-include = "'app / koreksi / template / grup-koreksi-table.html' ">
Shilan

25

Jika Anda menggunakan Grunt untuk membangun proyek Anda, ada sebuah plugin yang secara otomatis akan merakit parsial Anda menjadi modul Angular yang menawarkan $ templateCache. Anda dapat menggabungkan modul ini dengan sisa kode Anda dan memuat semuanya dari satu file saat startup.

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


11
Ada juga grunt-angular-templatesyang melakukan hal yang sama - npmjs.org/package/grunt-angular-templates - berfungsi dengan baik
Ben Walding

Apakah ini juga berfungsi untuk templat pada file indeks? Saya memiliki ng-view dan ng-include dalam file indeks saya dan saya mengalami kesulitan untuk membuat aplikasi saya muncul.
Batman

16

Tambahkan tugas build untuk menggabungkan dan mendaftarkan parsial html Anda di Angular $templateCache. ( Jawaban ini adalah varian jawaban karlgold yang lebih rinci . )

Untuk grunt , gunakan grunt-angular-templates . Untuk tegukan , gunakan tegukan-angular-templatecache .

Berikut cuplikan konfigurasi / kode untuk diilustrasikan.

Contoh gruntfile.js:

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

Contoh gulpfile.js:

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 (file ini dibuat secara otomatis oleh tugas build)

$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>

2
Hi @james Saya menggunakan plugin tegukan ini. Semua .html memuat dengan benar tetapi ketika saya mencoba menentukan html sebagai bagian dari beberapa plugin kotak dialog (saya menggunakan bahan-ng) ia melempar 404. ex - $ mdDialog.show ({controller: 'entitasGridCtrl', templateUrl: 'user / partials / entityGrid.html '});
Anand

Apakah Anda mengganti referensi aplikasi / tampilan saya dengan pengguna / sebagian?
James Lawruk

Terima kasih. Saya tidak mengubah jalur parsial, saya memposting pertanyaan saya - stackoverflow.com/questions/29399453/…
Anand

11

Jika Anda membungkus setiap template dalam tag skrip, misalnya:

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

Gabungkan semua template menjadi 1 file besar. Jika menggunakan Visual Studio 2013, unduh Web esensial - ia menambahkan menu klik kanan untuk membuat Bundel HTML.

Tambahkan kode yang ditulis orang ini untuk mengubah $templatecachelayanan sudut - hanya sepotong kecil kode dan berfungsi: Vojta Jina's Gist

Itu $http.getyang harus diubah untuk menggunakan file bundel Anda:

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

Rute Anda templateUrlakan terlihat seperti ini:

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


0

Saya hanya menggunakan ecountuk melakukan pekerjaan untuk saya. ecodidukung oleh Sprockets secara default. Ini adalah singkatan untuk Embedded Coffeescript yang mengambil file eco dan mengkompilasi ke file template Javascript, dan file tersebut akan diperlakukan seperti file js lain yang Anda miliki di folder aset Anda.

Yang perlu Anda lakukan adalah membuat templat dengan ekstensi .jst.eco dan menulis beberapa kode html di sana, dan rel akan secara otomatis mengkompilasi dan menyajikan file dengan pipa aset, dan cara mengakses templat itu sangat mudah: di JST['path/to/file']({var: value});mana path/to/filedidasarkan pada jalur logis, jadi jika Anda memiliki file /assets/javascript/path/file.jst.eco, Anda dapat mengakses template diJST['path/file']()

Untuk membuatnya berfungsi dengan angularjs, Anda bisa meneruskannya ke atribut template alih-alih templateDir, dan itu akan mulai bekerja secara ajaib!


Saya tidak yakin ini menjawab pertanyaan, dan mengubah bahasa pemrograman mungkin berlebihan.
xdhmoore

0

Anda dapat melewatkan $ state ke controller Anda dan kemudian ketika halaman memuat dan memanggil getter di controller Anda memanggil $ state.go ('index') atau bagian apa pun yang ingin Anda muat. Selesai


-1

Metode lain adalah dengan menggunakan Cache Aplikasi HTML5 untuk mengunduh semua file sekaligus dan menyimpannya di cache browser. Tautan di atas mengandung lebih banyak informasi. Informasi berikut berasal dari artikel:

Ubah <html>tag Anda untuk menyertakan manifestatribut:

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

File manifes harus disajikan dengan tipe mime text/cache-manifest.

Manifes sederhana terlihat seperti ini:

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

Setelah aplikasi offline, aplikasi ini tetap di-cache hingga salah satu dari yang berikut terjadi:

  1. Pengguna menghapus penyimpanan data browser mereka untuk situs Anda.
  2. File manifes dimodifikasi. Catatan: memperbarui file yang tercantum dalam manifes tidak berarti browser akan men-cache ulang sumber daya itu. File manifes itu sendiri harus diubah.

1
sayangnya fitur ini sudah tidak digunakan lagi sekarang developer.mozilla.org/en-US/docs/Web/HTML/… jadi tunggu sebentar, gunakan pendekatan ini dengan risiko Anda sendiri
Lazy Coder

Menurut standar HTML, "Fitur ini sedang dalam proses dihapus dari platform Web. (Ini adalah proses panjang yang memakan waktu bertahun-tahun.)" Pengganti yang disarankan, Pekerja Layanan, masih merupakan "Teknologi Eksperimental" pada saat awal 2016. Untuk saat ini, saya masih menggunakan Cache Aplikasi karena berfungsi dengan baik untuk aplikasi saya.
Brent Washburne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.