มีวิธีทำให้ AngularJS โหลด partials ในตอนเริ่มต้นหรือไม่เมื่อจำเป็น?


190

ฉันมีการตั้งค่าเส้นทางเช่นนี้:

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

ฉันต้องการให้สามารถดาวน์โหลด angularjs ได้ทั้งตอนแรกและตอนที่ร้องขอ

เป็นไปได้ไหม?

คำตอบ:


270

ใช่มีทางออกอย่างน้อย 2 ข้อสำหรับสิ่งนี้:

  1. ใช้scriptคำสั่ง ( http://docs.angularjs.org/api/ng.directive:script ) เพื่อใส่งานของคุณใน HTML ที่โหลดครั้งแรก
  2. คุณสามารถกรอก$templateCache( http://docs.angularjs.org/api/ng.$templateCache ) จาก JavaScript ได้ถ้าต้องการ (อาจเป็นไปตามผลการ$httpโทร)

หากคุณต้องการใช้วิธีการ (2) ในการกรอกข้อมูล$templateCacheคุณสามารถทำสิ่งนี้ได้:

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

แน่นอนว่าเนื้อหาเทมเพลตอาจมาจากการ$httpโทร:

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

นี่คือเทคนิคที่พลั่วเกอร์เหล่านั้นคือ: http://plnkr.co/edit/J6Y2dc?p=preview


2
ขอบคุณสำหรับการตอบกลับ. ฉันชอบเทมเพลตแคชแนวคิดเพราะฉันไม่ต้องการใส่สิ่งต่างๆลงในแท็กสคริปต์ วิธีใช้งาน เอกสารไม่ดี ฉันเห็นซอในหนึ่งในความคิดเห็นที่นั่น แต่ฉันต้องการโหลดจาก url
Ranjith Ramachandra

อัปเดตคำตอบตามความคิดเห็น
pkozlowski.opensource

4
บางครั้งฉันใช้<script>แท็กอินไลน์พร้อมกับการรวมฝั่งเซิร์ฟเวอร์ สิ่งนี้ทำให้ฉันเก็บ partials ของฉันเป็นไฟล์แยกต่างหากสำหรับจุดประสงค์ขององค์กร แต่ยังคงส่งมอบทุกอย่างในเอกสารเดียว
Blazemonger

2
คุณรู้หรือไม่ว่ามีการเร่งความเร็วในการเลือกโซลูชันหนึ่งกับอีกโซลูชันหนึ่งหรือไม่?
Atav32

2
ฉันแคชเทมเพลตโดยใช้การโทร http แต่ปัญหาคือชื่อของเทมเพลตแคชจะเป็น url forexample: $ http.get ('แอพ / การแก้ไข / แม่แบบ / group-correction-table.html', {cache: $ templateCache}); และเมื่อใดก็ตามที่ฉันต้องการโหลดเทมเพลตฉันต้องใช้ชื่อที่น่าเกลียดนี้ :( ซึ่งฉันไม่ชอบ, ชอบสิ่งนี้: <td ng-include = "'แอพ / การแก้ไข / เทมเพลต / group-correction-table.html' ">
Shilan

25

หากคุณใช้ Grunt ในการสร้างโครงการของคุณจะมีปลั๊กอินที่จะรวบรวมชิ้นงานของคุณโดยอัตโนมัติในโมดูล Angular ที่ primes $ templateCache คุณสามารถต่อโมดูลนี้เข้ากับส่วนที่เหลือของรหัสและโหลดทุกอย่างจากไฟล์เดียวเมื่อเริ่มต้น

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


11
นอกจากนี้ยังมีgrunt-angular-templatesสิ่งที่เหมือนกัน - npmjs.org/package/grunt-angular-templates - ทำงานเพื่อการรักษา
Ben Walding

สิ่งนี้ใช้ได้กับเทมเพลตในไฟล์ดัชนีหรือไม่ ฉันมีมุมมอง ng และรวมอยู่ในไฟล์ดัชนีของฉันและฉันมีปัญหาในการทำให้แอปพลิเคชันของฉันปรากฏ
แบทแมน

16

เพิ่มการสร้างงานในการเชื่อมและการลงทะเบียนของคุณ HTML partials $templateCacheในเชิงมุม ( คำตอบนี้เป็นคำตอบที่แตกต่างของคำตอบของ karlgold )

สำหรับเสียงฮึดฮัดใช้ฮึดฮัดเชิงมุมแม่แบบ สำหรับอึกใช้อึกเชิงมุม-templatecache

ด้านล่างเป็นตัวอย่างโค้ดการกำหนดค่า / เพื่อแสดง

ตัวอย่าง gruntfile.js:

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

ตัวอย่าง 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 (ไฟล์นี้สร้างอัตโนมัติโดยงานบิลด์)

$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
สวัสดี @ เจมส์ฉันใช้ปลั๊กอินอึกนี้ โหลด. html ทั้งหมดอย่างถูกต้อง แต่เมื่อฉันพยายามระบุ html เป็นส่วนหนึ่งของปลั๊กอินกล่องโต้ตอบ (ฉันใช้วัสดุ ng) มันจะพ่น 404 ตัวอย่าง - $ mdDialog.show ({controller: 'entityGridCtrl', templateUrl: 'user / partials / entityGrid.html '});
อานันท์

คุณแทนที่การอ้างอิงแอพ / มุมมองของฉันด้วยผู้ใช้ / ชิ้นส่วนของคุณ?
James Lawruk

ขอบคุณ. ฉันไม่ได้เปลี่ยนเส้นทางของ Partials ฉันโพสต์คำถามของฉัน - stackoverflow.com/questions/29399453/…
Anand

11

หากคุณห่อแต่ละเทมเพลตในแท็กสคริปต์เช่น:

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

ต่อเทมเพลตทั้งหมดเป็นไฟล์ขนาดใหญ่ 1 ไฟล์ หากใช้ Visual Studio 2013 ดาวน์โหลดสิ่งจำเป็นสำหรับเว็บ - เพิ่มเมนูคลิกขวาเพื่อสร้าง HTML Bundle

เพิ่มรหัสที่ผู้ชายคนนี้เขียนไว้เพื่อเปลี่ยน$templatecacheบริการเชิงมุม- เป็นเพียงชิ้นส่วนรหัสขนาดเล็กเท่านั้นและใช้งานได้: Vojta Jina's Gist

มัน$http.getควรจะเปลี่ยนเป็นไฟล์บันเดิลของคุณ:

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

เส้นทางของคุณtemplateUrlควรมีลักษณะเช่นนี้:

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

2

หากคุณใช้ rails คุณสามารถใช้ไพพ์ไลน์ของสินทรัพย์เพื่อรวบรวมและผลักเทมเพลต haml / erb ทั้งหมดของคุณลงในโมดูลแม่แบบซึ่งสามารถผนวกเข้ากับไฟล์ application.js ของคุณ ชำระเงิน http://minhajuddin.com/2013/04/28/angularjs-templates-and-rails-with-eager-loading


0

ฉันใช้ecoเพื่อทำงานให้ฉัน ecoได้รับการสนับสนุนโดย Sprockets เป็นค่าเริ่มต้น มันเป็นชวเลขสำหรับ Embedded Coffeescript ซึ่งใช้ไฟล์ eco และคอมไพล์ลงในไฟล์เทมเพลต Javascript และไฟล์นั้นจะได้รับการปฏิบัติเหมือนไฟล์ js อื่น ๆ ที่คุณมีในโฟลเดอร์ทรัพย์สินของคุณ

สิ่งที่คุณต้องทำคือการสร้างเทมเพลตที่มีนามสกุล. jst.eco และเขียนโค้ด html ในนั้นและ Rails จะคอมไพล์และให้บริการไฟล์กับไพพ์ไลน์ของสินทรัพย์โดยอัตโนมัติและวิธีการเข้าถึงเทมเพลตนั้นง่ายมาก: JST['path/to/file']({var: value});ที่ไหนpath/to/fileขึ้นอยู่กับโลจิคัลพา ธ ดังนั้นหากคุณมีไฟล์/assets/javascript/path/file.jst.ecoคุณสามารถเข้าถึงเทมเพลตได้ที่JST['path/file']()

ในการทำให้มันทำงานกับ angularjs คุณสามารถส่งไปยังแอตทริบิวต์ template แทน templateDir และมันจะเริ่มทำงานได้อย่างน่าอัศจรรย์!


ฉันไม่แน่ใจว่าสิ่งนี้ตอบคำถามและการเปลี่ยนภาษาการเขียนโปรแกรมน่าจะเกินความจริง
xdhmoore

0

คุณสามารถส่ง $ state ไปยังคอนโทรลเลอร์ของคุณและเมื่อเพจโหลดและเรียกใช้ getter ในคอนโทรลเลอร์ที่คุณเรียกใช้ $ state.go ('index') หรืออะไรก็ตามที่คุณต้องการโหลด เสร็จสิ้น


-1

อีกวิธีหนึ่งคือการใช้Application Cacheของ HTML5 เพื่อดาวน์โหลดไฟล์ทั้งหมดหนึ่งครั้งและเก็บไว้ในแคชของเบราว์เซอร์ ลิงค์ด้านบนมีข้อมูลมากขึ้น ข้อมูลต่อไปนี้มาจากบทความ:

เปลี่ยนของคุณ <html>แท็กเพื่อรวมmanifestแอตทริบิวต์:

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

ไฟล์รายการจะต้องให้บริการกับประเภท mime text/cache-manifestmime

รายการง่าย ๆ มีลักษณะดังนี้:

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

เมื่อแอปพลิเคชันออฟไลน์มันจะยังคงถูกเก็บไว้จนกว่าจะมีสิ่งใดสิ่งหนึ่งต่อไปนี้เกิดขึ้น:

  1. ผู้ใช้ล้างที่เก็บข้อมูลของเบราว์เซอร์สำหรับเว็บไซต์ของคุณ
  2. ไฟล์ Manifest ถูกแก้ไข หมายเหตุ: การอัปเดตไฟล์ที่ปรากฏในรายการไม่ได้หมายความว่าเบราว์เซอร์จะแคชทรัพยากรนั้นอีกครั้ง ไฟล์ Manifest ต้องถูกแก้ไข

1
น่าเสียดายที่ฟีเจอร์นี้ไม่ได้รับการสนับสนุนในขณะนี้developer.mozilla.org/en-US/docs/Web/HTML/ดังนั้นเพียงแค่ใช้วิธีนี้ในความเสี่ยงของคุณเอง
Lazy Coder

ตามมาตรฐาน HTML "คุณสมบัตินี้อยู่ในขั้นตอนการลบออกจากแพลตฟอร์มเว็บ (นี่เป็นกระบวนการที่ใช้เวลานานหลายปี)" การแทนที่ที่แนะนำ Service Workers ยังคงเป็น "เทคโนโลยีการทดลอง" ณ ต้นปี 2559 สำหรับตอนนี้ฉันยังคงใช้ Application Cache อยู่เพราะทำงานได้ดีสำหรับแอปพลิเคชันของฉัน
Brent Washburne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.