Có hai phần: trước hết bạn cần vô hiệu hóa bộ định tuyến khỏi việc khởi động trang tải đầu tiên. Điều này có thể được thực hiện như sau:
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();
});
Thứ hai chúng ta cần phải thiết lập ui xem một cách chính xác: Bán phá giá đánh dấu server-rendered bên trong ui-view gây ra các vấn đề hành vi kỳ lạ với bộ điều khiển đầu tiên được chạy hai lần (xem https://github.com/angular-ui/ui-router/issues/1807), vì vậy chúng tôi sẽ thêm đánh dấu máy chủ của chúng tôi ngay sau khi xem ui-view div và ẩn giao diện ui cho đến khi có sự kiện điều hướng.
<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>
Bây giờ chúng ta cần phải thiết lập isFirstPageLoad trong $ phạm vi:
app.controller('PropertyDetailCtrl', function loader($rootScope, $scope) {
$scope.isFirstPageLoad = true;
$rootScope.$on('$viewContentLoading', function(event, viewConfig) {
$scope.isFirstPageLoad = false;
});
});
Chúng tôi đã sử dụng ng-áo choàng để đảm bảo rằng trang cư xử một cách hoàn hảo nếu javascript bị vô hiệu hóa, vì vậy bây giờ chúng tôi đã có một phía máy chủ hoàn toàn được tải trang đầu tiên với tất cả các điều hướng tiếp theo được xử lý bởi ui-router.
Kiểm tra liên kết được cung cấp trong vấn đề: https://angular-ui.github.io/ui-router/site/#/api/ui.router.router.$urlRouterProvider#methods_deferintercept. Nó thậm chí còn cung cấp một ví dụ. Hãy chắc chắn rằng bạn gọi phương thức đó trong khi bạn đang bootstrapping cấu hình ứng dụng của bạn. – Dom
Thật kỳ lạ, tôi chỉ thấy một trang trống trong Chrome (http://share.aidanlister.com/aYJx), đó là lý do tại sao tôi rất bối rối. – Aidan
Làm thế nào để bạn xử lý hiển thị phía máy chủ? –