我在项目中使用angularjs。
我能够从数据库中获取记录并在html页面中绑定。这里我需要从数据库中的4个集合中获取数据,因此我需要执行多次服务器调用来获取数据。当我在单独的Scope变量中分配所有内容时。我的示例代码在
下面var click = function(){
$http.get('/CalBuildingget').then(function (response) {
$scope.ViewBuildings = response.data;
});
for (i = 0; i < $scope.ViewBuildings.length; i++) {
$http.get('/CalBuildingFloorget/'+ scope.ViewManageBuildings[i]._id).then(function (response) {
$scope.floorDetails = response.data;
});
}
在这里,我需要通过其ID获取每个Building的楼层,并将其作为数组对象存储在构建范围中,然后再通过floor id获取再次需要进行服务器调用并在范围内分配的单元。
我如何实现这一点,首先它执行循环然后它启动服务器调用构建。
答案 0 :(得分:0)
您需要在第一次请求的成功回调中获取楼层。 就像这样。
var click = function(){
$http.get('/CalBuildingget').then(function (response) {
$scope.ViewBuildings = response.data;
for (i = 0; i < $scope.ViewBuildings.length; i++) {
$http.get('/CalBuildingFloorget/'+ scope.ViewManageBuildings[i]._id).then(function (response) {
$scope.floorDetails = response.data;
});
}
});
答案 1 :(得分:0)
您将使用正在使用的方法搞乱应用程序的整体性能,您确定要在循环中发送HTTP调用吗?想想你有大约1000条记录的案例,你是否应该向服务器发送1000个HTTP呼叫?相反,为什么不在/ CalBuildingget /?
中获取floorDetails永远不要在循环中发送HTTP调用,考虑网络带宽和应用程序性能。
答案 2 :(得分:0)
对于多个后续服务调用,您应始终使用promise概念。从概念上讲,它应该如下所示:
function callServiceForEachItem() {
var promise;
angular.forEach(items, function(item) {
if (!promise) {
//First time through so just call the service
promise = fakeService.doSomething(item);
} else {
//Chain each subsequent request
promise = promise.then(function() {
return fakeService.doSomething(item);
});
}
});
}
使用此链接获取最佳做法perform chain service call
您可以查看this讨论