2013-10-28 13 views
5

Non voglio caricare pigro i miei modelli di percorso. Invece voglio caricare tutti i miei modelli di percorso in $ templateCache prima di qualsiasi esecuzione di percorsi.

Questo è quello che sto facendo:

angular.module('myApp', ['ngRoute']).config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) 
{ 
    $locationProvider.html5Mode(false); 

    $routeProvider.when("/main", {templateUrl: "main", controller: "MainCtrl"}) 
        .when("/login",{templateUrl: "login", controller: "LoginCtrl"}); 
}]) 
.run(['$location','$templateCache', function ($location, $templateCache) 
{ 
    //...Save templates in $templateCache 
    $location.path("/login"); 
}]); 

Questo funziona bene se si passa a / in quanto non corrisponde ad alcun percorso. Ma se si naviga o si aggiorna su /#/login, sembra che il servizio di instradamento tenti di caricare il modello prima che il mio blocco di esecuzione venga eseguito e faccia una richiesta al server per esso.

Esiste comunque un modo per garantire che il codice che popola il $ templateCache venga eseguito prima che il servizio di route vada alla ricerca del modello?

risposta

3

Se si utilizza il grunt si consiglia vivamente grunt-angular-templates per questo scopo, ma se non lo si desidera e si desidera creare manualmente un modulo separato in cui si abbia una logica simile a ciò che si ha ora, qualcosa in linea:

angular.module('myapp.templates').run(['$templateCache', function($templateCache) { 
$templateCache.put(... 

e quindi fare semplicemente riferimento a quel modulo come dipendenza dell'app. Il blocco di esecuzione del modulo di dipendenza verrà eseguito prima che la logica di routing venga avviata ed è ciò che si desidera.

+0

Questa è una buona idea. Pensavo che avrebbe funzionato, ma non è così. Il blocco * config * del modulo principale 'myApp' viene eseguito prima del blocco * run * del modulo 'templates' anche se myApp ha una dipendenza dai template. Sto pensando che i blocchi di configurazione non debbano aspettare le dipendenze per eseguirli come probabilmente fanno i blocchi di esecuzione. E sfortunatamente i percorsi devono essere impostati in un blocco di configurazione. – CHS

+0

Sì, i percorsi devono essere impostati nel blocco di configurazione, ma il routing non viene eseguito nel blocco di configurazione, quindi il codice che ho allegato farà il trucco, $ templateCache verrà compilato prima del reindirizzamento. Lo faccio nelle mie app (usando grunt-angular-templates) e funziona perfettamente. –

+0

@Tadeusz No, controlla il tuo traffico di rete. Il routing tenterà di scaricare il modello per il percorso corrispondente all'URL corrente anche prima dell'esecuzione dei blocchi di esecuzione. (1.2-rc3) Potresti non accorgertene se il tuo server è in grado di rispondere correttamente a questa richiesta. Le future modifiche al percorso useranno la cache, ma quella iniziale no. – user169867

Problemi correlati