Có cách nào để làm cho AngularJS tải partials ngay từ đầu và không khi cần thiết không?


190

Tôi có một thiết lập tuyến đường như thế này:

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

Tôi muốn có thể làm cho angularjs tải xuống cả hai phần đầu và không khi được yêu cầu.

Có thể không?

Câu trả lời:


270

Có, có ít nhất 2 giải pháp cho việc này:

  1. Sử dụng scriptchỉ thị ( http://docs.angularjs.org/api/ng.directive:script ) để đặt các phần của bạn vào HTML được tải ban đầu
  2. Bạn cũng có thể điền $templateCache( http://docs.angularjs.org/api/ng.$templateCache ) từ JavaScript nếu cần (có thể dựa trên kết quả $httpcuộc gọi)

Nếu bạn muốn sử dụng phương thức (2) để điền vào, $templateCachebạn có thể làm như thế này:

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

Tất nhiên nội dung mẫu có thể đến từ một $httpcuộc gọi:

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

Dưới đây là plunker những kỹ thuật đó: http://plnkr.co/edit/J6Y2dc?p=preview


2
Cảm ơn vi đa trả lơi. Tôi thích ý tưởng bộ đệm mẫu vì tôi không muốn đặt mọi thứ vào thẻ script. Làm thế nào để sử dụng nó? Tài liệu là xấu. Tôi đã nhìn thấy các fiddle trong một trong những ý kiến ​​ở đó. Nhưng tôi muốn tải từ một url.
Ranjith Ramachandra

Cập nhật câu trả lời dựa trên các bình luận
pkozlowski.opensource

4
Đôi khi tôi sử dụng <script>thẻ nội tuyến cùng với phía máy chủ bao gồm. Điều này cho phép tôi giữ các phần của mình dưới dạng các tệp riêng biệt cho mục đích tổ chức, nhưng vẫn cung cấp mọi thứ trong một tài liệu.
Blazemonger

2
Bạn có biết liệu có sự tăng tốc trong việc chọn một giải pháp so với giải pháp khác không?
Atav32

2
Tôi đang lưu mẫu mẫu bằng cách sử dụng cuộc gọi http, nhưng vấn đề là tên của mẫu được lưu trong bộ nhớ cache sẽ là ví dụ url: $ http.get ('app / chỉnh sửa / mẫu / nhóm-chỉnh-bảng.html', {cache: $ templateCache}); và sau đó bất cứ khi nào tôi muốn tải mẫu, tôi phải sử dụng tên xấu xí này :( mà tôi không thích, Giống như thế này: <td ng-include = "'app / chỉnh sửa / mẫu / nhóm-chỉnh-bảng.html' ">
Shilan

25

Nếu bạn sử dụng Grunt để xây dựng dự án của mình, có một plugin sẽ tự động lắp ráp các phần của bạn thành một mô-đun Angular có giá trị $ templateCache. Bạn có thể nối mô-đun này với phần còn lại của mã và tải mọi thứ từ một tệp khi khởi động.

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


11
Cũng có grunt-angular-templatesloại điều tương tự - npmjs.org/package/grunt-angular-temsheet - hoạt động một điều trị
Ben Walding

Điều này cũng làm việc cho các mẫu trên tệp chỉ mục? Tôi có chế độ xem ng và bao gồm trong tệp chỉ mục của mình và tôi gặp sự cố khi ứng dụng của mình hiển thị.
dơi

16

Thêm một nhiệm vụ xây dựng để nối và đăng ký các phần html của bạn trong Angular $templateCache. ( Câu trả lời này là một biến thể chi tiết hơn của câu trả lời của karlgold. )

Đối với grunt , sử dụng grunt-angular-samples . Đối với gulp , sử dụng gulp-angular-templatecache .

Dưới đây là đoạn mã cấu hình / mã để minh họa.

gruntfile.js Ví dụ:

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

gulpfile.js Ví dụ:

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

samples.js (tệp này được tự động tạo bởi tác vụ xây dựng)

$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
Xin chào @james Tôi đang sử dụng plugin gulp này. Tất cả .html tải đúng cách nhưng khi tôi cố gắng chỉ định html là một phần của một số plugin hộp thoại (tôi đang sử dụng ng-liệu), nó sẽ ném 404. ex - $ mdDialog.show ({controller: 'entityGridCtrl', templateUrl: 'user / partials / entityGrid.html '});
Anand

Bạn đã thay thế các tham chiếu ứng dụng / lượt xem của tôi bằng người dùng / partials của bạn chưa?
James Lawruk

Cám ơn. Tôi không thay đổi đường dẫn của partials, tôi đã đăng câu hỏi của mình - stackoverflow.com/questions/29399453/
Anand

11

Nếu bạn bọc từng mẫu trong thẻ script, ví dụ:

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

Ghép tất cả các mẫu thành 1 tệp lớn. Nếu sử dụng Visual Studio 2013, hãy tải xuống các yếu tố cần thiết cho Web - nó thêm menu nhấp chuột phải để tạo Gói HTML.

Thêm mã mà anh chàng này đã viết để thay đổi $templatecachedịch vụ góc cạnh - đây chỉ là một đoạn mã nhỏ và nó hoạt động: Vojta Jina's Gist

Của nó $http.getcần được thay đổi để sử dụng tập tin bó của bạn:

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

Tuyến đường của bạn templateUrlsẽ trông như thế này:

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


0

Tôi chỉ sử dụng ecođể làm công việc cho tôi. ecođược Sprockets hỗ trợ theo mặc định. Đó là một cách viết tắt cho Coffeescript nhúng để lấy tệp sinh thái và biên dịch thành tệp mẫu Javascript và tệp sẽ được xử lý như bất kỳ tệp js nào khác bạn có trong thư mục tài sản của mình.

Tất cả những gì bạn cần làm là tạo một mẫu có phần mở rộng .jst.eco và viết một số mã html vào đó, và rails sẽ tự động biên dịch và phục vụ tệp bằng đường dẫn tài sản và cách truy cập mẫu rất dễ dàng: JST['path/to/file']({var: value});trong đó path/to/fileđược dựa trên đường dẫn logic, vì vậy nếu bạn có tệp trong /assets/javascript/path/file.jst.eco, bạn có thể truy cập vào mẫu tạiJST['path/file']()

Để làm cho nó hoạt động với angularjs, bạn có thể chuyển nó vào thuộc tính template thay vì templateDir và nó sẽ bắt đầu hoạt động một cách kỳ diệu!


Tôi không chắc điều này trả lời câu hỏi và thay đổi ngôn ngữ lập trình có lẽ là quá mức cần thiết.
xdhmoore

0

Bạn có thể chuyển $ state cho bộ điều khiển của mình và sau đó khi trang tải và gọi getter trong bộ điều khiển bạn gọi $ state.go ('index') hoặc bất kỳ phần nào bạn muốn tải. Làm xong.


-1

Một phương pháp khác là sử dụng Cache ứng dụng của HTML5 để tải xuống tất cả các tệp một lần và giữ chúng trong bộ đệm của trình duyệt. Các liên kết trên có chứa nhiều thông tin hơn. Các thông tin sau đây là từ bài viết:

Thay đổi <html>thẻ của bạn để bao gồm một manifestthuộc tính:

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

Một tệp kê khai phải được phục vụ với loại mime text/cache-manifest.

Một bảng kê đơn giản trông giống như thế này:

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

Khi một ứng dụng ngoại tuyến, nó vẫn được lưu trong bộ nhớ cache cho đến khi một trong những điều sau đây xảy ra:

  1. Người dùng xóa lưu trữ dữ liệu trình duyệt của họ cho trang web của bạn.
  2. Tệp kê khai được sửa đổi. Lưu ý: cập nhật tệp được liệt kê trong tệp kê khai không có nghĩa là trình duyệt sẽ lưu lại tài nguyên đó. Bản thân tệp kê khai phải được thay đổi.

1
thật không may, tính năng này không được chấp nhận ngay bây giờ developer.mozilla.org/en-US/docs/Web/HTML/NH vì vậy chỉ cần một người đứng đầu, sử dụng phương pháp này có nguy cơ của riêng bạn
Lazy Coder

Theo tiêu chuẩn HTML, "Tính năng này đang trong quá trình xóa khỏi nền tảng Web. (Đây là một quá trình dài phải mất nhiều năm.)" Sự thay thế được đề xuất, Service Workers, vẫn là một "công nghệ thử nghiệm". đầu năm 2016. Hiện tại, tôi vẫn đang sử dụng Cache ứng dụng vì nó hoạt động tốt cho các ứng dụng của tôi.
Brent Washburne
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.