2015-04-04 23 views
5

Al primo colpo su una pagina voglio inviare una pagina completamente renderizzata all'utente. Funziona bene se javascript è disabilitato, ma se javascript è abilitato, angular-ui-router controlla lo stato e esegue il rendering in ui-view sulla parte superiore del contenuto esistente. C'è un modo per disabilitare questo sulla prima pagina caricare in qualche modo?Impedire l'angolare-ui-router dal ricaricamento della vista ui sul caricamento della prima pagina

Vedere questo numero: https://github.com/angular-ui/ui-router/issues/1807 che suggerisce l'utilizzo di $ urlRouterProvider.deferIntercept(), ma non riesco a trovare molta documentazione sull'utilizzo e non so come intercettare il caricamento della prima pagina.

+0

Controllare il collegamento fornito nel problema: https://angular-ui.github.io/ui-router/site/#/api/ui.router.router.$urlRouterProvider#methods_deferintercept. Fornisce anche un esempio. Assicurati di chiamare quel metodo durante il bootstrap della configurazione dell'app. – Dom

+0

È strano, vedo solo una pagina vuota in Chrome (http://share.aidanlister.com/aYJx) ed è per questo che ero così confuso. – Aidan

+0

Come gestite il rendering lato server? –

risposta

6

Ci sono due parti: in primo luogo è necessario disabilitare il router dal kicking sul caricamento della prima pagina. Questo può essere fatto in questo modo:

app.config(function($httpProvider, $urlRouterProvider) { 
    // On the first page load disable ui-router so that 
    // our server rendered page is not reloaded based on the window location. 
    $urlRouterProvider.deferIntercept(); 
}); 

In secondo luogo abbiamo bisogno di impostare la ui-avviso correttamente: Dumping il markup server di rendering all'interno del ui-view provoca problemi di comportamento strano con il primo controller viene eseguito due volte (vedi https://github.com/angular-ui/ui-router/issues/1807), quindi aggiungeremo il markup di rendering del server subito dopo il div dell'interfaccia ui e nascondiamo la vista ui fino a quando non ci sarà un evento di navigazione.

<div ng-controller="PropertyDetailCtrl"> 
    <div class="ng-cloak" ng-show="!isFirstPageLoad" ui-view></div> 

    <div ng-show="isFirstPageLoad"> 
    (server rendered markup goes here) 
    </div> 
</div> 

Ora abbiamo bisogno di impostare isFirstPageLoad nel $ campo di applicazione:

app.controller('PropertyDetailCtrl', function loader($rootScope, $scope) { 
    $scope.isFirstPageLoad = true; 

    $rootScope.$on('$viewContentLoading', function(event, viewConfig) { 
    $scope.isFirstPageLoad = false; 
    }); 
}); 

Abbiamo utilizzato ng-mantello per fare in modo che la pagina si comporta perfettamente se javascript è disattivato, così ora abbiamo ha ottenuto un caricamento completo della prima pagina del lato server con tutta la successiva navigazione gestita da ui-router.

+0

Hai capito come affrontare l'andare avanti e indietro nella storia. Se si naviga in stati diversi e poi si usa il pulsante indietro per tornare alla pagina con isFirstPageLoad = true, il contenuto statico è ancora lì, ma viene caricato anche lo stato dinamico. –

+1

Onestamente, ho passato da Angular a React e questo ha risolto tutto ... – Aidan

Problemi correlati