【问题标题】:Angular Prerendering to delay html page load for prerender to load AjaxAngular Prerendering 延迟 html 页面加载,以便 prerender 加载 Ajax
【发布时间】:2014-05-16 13:32:31
【问题描述】:

我正在使用 Angular 我需要延迟我的页面输出的完整输出,以便机器人在机器人停止处理 HTML 之前给内容加载时间。我的整个页面将呈现,并且预呈现服务认为页面已完成,但 ajax 仍在加载数据。我只需要延迟内容刷新,直到 ajax 加载完全完成。 Angular 中是否有一个好方法可以做到这一点?

我使用 Prerendering.io 作为我的预渲染服务。

【问题讨论】:

    标签: ajax angularjs seo


    【解决方案1】:

    您应该使用resolve 机制:

    $module.config(['$routeProvider',
        function($routeProvider) {
            $routeProvider.when('/actionWithAjaxData', {
                templateUrl: 'action.tpl.html',
                controller: 'ActionCtrl',
                resolve: {
                    data: ['dataResource',
                        function(dataResource, APP_CONFIG) {
                            return dataResource.get(); //must return a promise
                        }
                    ]
                }
            })
        }
    ])
    .controller('ActionCtrl', ['data',
        function(data) {
            //data contains your ajax loaded data
        }
    ])
    

    这样,控制器只有在所有的承诺都被解决后才会被构造。 如果一个 Promise 被拒绝,你需要使用像 $routeChangeError 这样的错误处理程序来拦截它

    更多信息:https://docs.angularjs.org/api/ngRoute/provider/$routeProvider

    也就是说,如果你想延迟页面的显示,直到它的所有ajax请求都OK

    如果您想要其他方式:显示页面但在制作 ajax 时将页面的某些部分留空/隐藏。您可以使用监视程序监视任何 ajax 请求,例如 angular-app 应用程序之一:

    angular.module('services.httpRequestTracker', []);
    angular.module('services.httpRequestTracker').factory('httpRequestTracker', ['$http', function($http){
    
      var httpRequestTracker = {};
      httpRequestTracker.hasPendingRequests = function() {
        return $http.pendingRequests.length > 0;
      };
    
      return httpRequestTracker;
    }]);
    

    并在模板中使用它,例如:

    <div class="spinner-container fade" ng-class="{in: hasPendingRequests(), out: !hasPendingRequests()}">
        <div class="spinner fade" ng-class="{in: hasPendingRequests(), out: !hasPendingRequests()}"></div>
    </div>
    

    这样,您将能够在发出请求时显示加载器...

    最后,如果您想将页面的特定部分链接到特定的 ajax 请求,您还可以使用 ajax 请求特定的回调(完成/错误)

    【讨论】:

    • 这不会延迟从为用户加载到加载数据的任何内容吗?我希望用户看到页面,但在数据加载之前页面不完整。我有点想要我的蛋糕,也想吃……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多