2015-04-04 11 views
5

Przy pierwszym trafieniu na stronę chcę wysłać użytkownikowi w pełni wyrenderowaną stronę. Działa to dobrze, jeśli javascript jest wyłączony, ale jeśli włączony jest javascript, to kąt-ui-router wyszukuje stan i wyświetla ui-view nad istniejącą treścią. Czy istnieje sposób, aby wyłączyć to na ładowanie pierwszej strony?Zapobieganie ponownemu ładowaniu ui-view przy ładowaniu pierwszej strony

Zobacz ten numer: https://github.com/angular-ui/ui-router/issues/1807, który sugeruje użycie $ urlRouterProvider.deferIntercept(), ale nie mogę znaleźć wiele dokumentacji na temat korzystania z niego i nie wiem, jak przechwycić ładowanie pierwszej strony.

+0

Sprawdź link podany w numerze: https://angular-ui.github.io/ui-router/site/#/api/ui.router.router.$urlRouterProvider#methods_deferintercept. Daje nawet przykład. Upewnij się, że wywołasz tę metodę podczas ładowania konfiguracji aplikacji. – Dom

+0

To dziwne, widzę tylko pustą stronę w Chrome (http://share.aidanlister.com/aYJx), dlatego byłem tak zdezorientowany. – Aidan

+0

Jak radzisz sobie z renderowaniem po stronie serwera? –

Odpowiedz

6

Istnieją dwie części: po pierwsze trzeba wyłączyć router od kopania przy pierwszym ładowaniu strony. Można to zrobić tak:

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(); 
}); 

drugie musimy skonfigurować UI-view poprawnie: Dumping znaczników serwera-renderowane wewnątrz ui-view powoduje problemy dziwne zachowanie z pierwszego kontrolera prowadzony jest dwa razy (patrz https://github.com/angular-ui/ui-router/issues/1807), więc dodamy nasz znacznik renderowany przez serwer tuż za ui-view div i ukrywamy widok ui, aż pojawi się wydarzenie nawigacyjne.

<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> 

Teraz musimy ustawić isFirstPageLoad w $ zakresie:

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

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

Użyliśmy NG-płaszcz, aby upewnić się, że strona zachowuje się idealnie, gdy JavaScript jest wyłączony, więc teraz mamy otrzymałem ładowanie strony po stronie serwera po pierwszej stronie, a cała kolejna nawigacja obsługiwana przez router Ui.

+0

Czy wymyśliłeś, jak radzić sobie z wychodzeniem z powrotem w historii? Jeśli przejdę do różnych stanów, a następnie użyję przycisku Wstecz, aby powrócić do strony z parametrem isFirstPageLoad = true, to statyczna zawartość nadal istnieje, ale załadowany jest również stan dynamiczny. –

+1

Szczerze mówiąc, zamieniłem się z Angular na React i to naprawiło wszystko ... – Aidan