AngularJS yükünü kısmi yapmanın bir yolu var mı, gerektiğinde değil mi?


190

Ben böyle bir rota kurulumu var:

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

İstendiğinde değil, başlangıçta hem kısmi indirmeye angularjs yapmak istiyorum.

Mümkün mü?

Yanıtlar:


270

Evet, bunun için en az 2 çözüm var:

  1. Kısmenlerinizi ilk yüklenen HTML'ye koymak için script( http://docs.angularjs.org/api/ng.directive:script ) yönergesini kullanın
  2. Gerekirse JavaScript'ten de $templateCache( http://docs.angularjs.org/api/ng.$templateCache ) doldurabilirsiniz (muhtemelen $httparamanın sonucuna göre )

Doldurmak için yöntem (2) kullanmak $templateCacheisterseniz bunu şu şekilde yapabilirsiniz:

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

Elbette şablon içeriği bir $httpçağrıdan gelebilir :

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

İşte bu teknikler plunker: http://plnkr.co/edit/J6Y2dc?p=preview


2
Cevap için teşekkürler. Ben şablon önbellek Fikir gibi şeyler bir komut dosyası etiketine koymak istemiyorum çünkü. Bu nasıl kullanılır? Belgeler kötü. Buradaki yorumlardan birinde kemanı gördüm. Ama bir url'den yüklemek istiyorum.
Ranjith Ramachandra


4
Bazen inline <script>etiketini sunucu tarafı içeriklerle birlikte kullanıyorum . Bu, kısmi öğelerimi kuruluş amacıyla ayrı dosyalar olarak saklamama izin veriyor, ancak yine de her şeyi tek bir belgede sunuyor.
Blazemonger

2
Bir çözümü diğerine seçerken hız artışı olup olmadığını biliyor musunuz?
Atav32

2
Http çağrısını kullanarak şablonları önbelleğe alıyorum, ancak sorun önbelleğe alınmış şablonun adı URL forexample: $ http.get ('app / correction / templates / group-correction-table.html', {cache: $ templateCache}); ve sonra şablonu yüklemek istediğimde, bu çirkin ismi kullanmak zorundayım :( beğenmediğim gibi: <td ng-include = "'app / correction / templates / group-correction-table.html' ">
Shilan

25

Projenizi oluşturmak için Grunt'u kullanırsanız, kısmi öğelerinizi otomatik olarak $ templateCache'i başlatan bir Açısal modülde birleştirecek bir eklenti vardır. Bu modülü kodunuzun geri kalanıyla birleştirebilir ve başlangıçta her şeyi tek bir dosyadan yükleyebilirsiniz.

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


11
Orada da var grunt-angular-templatesşey aynı tür yapar ki - npmjs.org/package/grunt-angular-templates - inşaat a muamele
Ben Walding

Bu, dizin dosyasındaki şablonlar için de çalışır mı? Dizin dosyamda bir ng-görünümü ve ng-include var ve benim uygulama göstermek için sorun yaşıyorum.
Batman

16

Birleştirme görevi ekleyin ve html parçalarınızı Açısal olarak kaydedin $templateCache. ( Bu cevap, karlgold'un cevabının daha ayrıntılı bir çeşididir . )

İçin homurtu , kullanmak hırıltı-açısal-şablonları . İçin yudum , kullanım yudum-açısal templatecache .

Aşağıda açıklanacak yapılandırma / kod parçacıkları verilmiştir.

gruntfile.js Örnek:

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

gulpfile.js Örnek:

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 (bu dosya oluşturma görevi tarafından otomatik olarak oluşturulur)

$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
Merhaba @james Bu yudum eklentisini kullanıyorum. Tüm .html düzgün yüklenir, ancak bazı iletişim kutusu eklentisinin bir parçası olarak html belirtmeye çalıştığımda (ng-material kullanıyorum) 404 atar. Ex - $ mdDialog.show ({controller: 'entityGridCtrl', templateUrl: 'user / partials / entityGrid.html '});
Anand

Uygulama / görünüm referanslarımı kullanıcı / kısmi kullanıcılarınızla değiştirdiniz mi?
James Lawruk

Teşekkürler. Kısmi yol değiştirmiyorum, sorumu yayınladım - stackoverflow.com/questions/29399453/…
Anand

11

Her şablonu bir komut dosyası etiketine sarırsanız, örneğin:

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

Tüm şablonları 1 büyük dosyada birleştirin. Visual Studio 2013 kullanıyorsanız, Web gereksinimlerini indirin - HTML Paketi oluşturmak için sağ tıklama menüsü ekler.

Bu adamın açısal $templatecachehizmeti değiştirmek için yazdığı kodu ekleyin - sadece küçük bir kod parçası ve işe yarıyor: Vojta Jina'nın Gist'i

Onun $http.getiçin paket dosyasını kullanmak için değişmesi gerektiğini:

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

Rotalarınız şu templateUrlşekilde görünmelidir:

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


0

Sadece ecoişi benim için yapıyorum. ecovarsayılan olarak Sprockets tarafından desteklenir. Bir eko dosyası alan ve bir Javascript şablon dosyasına derleyen Gömülü Coffeescript için bir kısayol ve dosya varlıklar klasörünüzde bulunan diğer js dosyaları gibi ele alınacaktır.

Tek yapmanız gereken .jst.eco uzantılı bir şablon oluşturmak ve oraya bazı html kodu yazmaktır ve raylar dosyayı otomatik olarak derler ve varlıklar boru hattıyla sunar ve şablona erişmenin yolu gerçekten kolaydır: JST['path/to/file']({var: value});nerede path/to/filemantıksal yola dayalı olduğundan, dosyada /assets/javascript/path/file.jst.ecovarsa, aşağıdaki şablona erişebilirsinizJST['path/file']()

Angularjs ile çalışmasını sağlamak için, templateDir yerine template özelliğine aktarabilirsiniz ve sihirli bir şekilde çalışmaya başlayacaktır!


Bunun soruyu cevapladığından emin değilim ve programlama dilini değiştirmek büyük olasılıkla aşırı.
xdhmoore

0

Kontrol cihazınıza $ durumunu iletebilir ve ardından sayfa kontrolöre alıcıyı yükleyip çağırdığında $ state.go ('index') veya yüklemek istediğiniz kısmi olarak adlandırırsınız. Bitti.


-1

Başka bir yöntem, tüm dosyaları bir kez indirmek ve tarayıcının önbelleğinde tutmak için HTML5'in Uygulama Önbelleğini kullanmaktır . Yukarıdaki link daha fazla bilgi içermektedir. Aşağıdaki bilgiler makaleden alınmıştır:

<html>Etiketinizi bir manifestözellik içerecek şekilde değiştirin :

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

Bir manifest dosyası mime tipi ile sunulmalıdır text/cache-manifest.

Basit bir manifest şöyle görünür:

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

Bir uygulama çevrimdışı olduğunda, aşağıdakilerden biri gerçekleşene kadar önbelleğe alınmış olarak kalır:

  1. Kullanıcı, sitenizin tarayıcısının veri depolama alanını temizler.
  2. Manifest dosyası değiştirildi. Not: Manifest'te listelenen bir dosyayı güncellemek, tarayıcının bu kaynağı yeniden önbelleğe alacağı anlamına gelmez. Manifest dosyasının kendisi değiştirilmelidir.

1
ne yazık ki bu özellik artık geliştirilmemiştir developer.mozilla.org/en-US/docs/Web/HTML/… bu yüzden sadece bir kafadan yukarıya, bu yaklaşımı kendi sorumluluğunuzda kullanın
Lazy Coder

HTML standardına göre, "Bu özellik Web platformundan kaldırılıyor. (Bu uzun yıllar süren uzun bir işlemdir.)" Önerilen değiştirme, Hizmet Çalışanları, halen "Deneysel teknoloji" dir. Şimdilik, Uygulama Önbelleği'ni kullanıyorum çünkü uygulamalarım için iyi çalışıyor.
Brent Washburne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.