【发布时间】:2014-05-16 13:32:31
【问题描述】:
我正在使用 Angular 我需要延迟我的页面输出的完整输出,以便机器人在机器人停止处理 HTML 之前给内容加载时间。我的整个页面将呈现,并且预呈现服务认为页面已完成,但 ajax 仍在加载数据。我只需要延迟内容刷新,直到 ajax 加载完全完成。 Angular 中是否有一个好方法可以做到这一点?
我使用 Prerendering.io 作为我的预渲染服务。
【问题讨论】:
我正在使用 Angular 我需要延迟我的页面输出的完整输出,以便机器人在机器人停止处理 HTML 之前给内容加载时间。我的整个页面将呈现,并且预呈现服务认为页面已完成,但 ajax 仍在加载数据。我只需要延迟内容刷新,直到 ajax 加载完全完成。 Angular 中是否有一个好方法可以做到这一点?
我使用 Prerendering.io 作为我的预渲染服务。
【问题讨论】:
您应该使用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 请求特定的回调(完成/错误)
【讨论】: