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.
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
È strano, vedo solo una pagina vuota in Chrome (http://share.aidanlister.com/aYJx) ed è per questo che ero così confuso. – Aidan
Come gestite il rendering lato server? –