开发者问题收集

AngularJS 仅在未定义时获取数据

2015-05-12
142

我正在使用控制器中的 $http 获取一些数据以向用户显示一些数据。但完成此操作后,我不想再进行任何获取,因为数据已获取。但是,当从一个选项卡(控制器)转到另一个选项卡(控制器)时,始终会获取数据。我的知识仅限于 Web 和 AngularJS。我以为下面的代码可以工作,但始终会获取数据。

// We already have data don't bother to get it again
if (angular.isDefined($scope.data)) {
    console.log("Already got data, no fetch");
    return;
} else {
    console.log("Fetch data first time");
}

$http.post('/api/data'......
1个回答

最有可能的是(尽管您的示例中没有足够的代码来确定)您的选项卡控制器具有不同的范围,因此实际上没有为第二个选项卡(控制器)定义 $scope.data

您当然可以将数据放在 $rootScope 上,但我建议不要这样做,因为我不建议将其放在全局变量上。

此外,这里会出现竞争条件,因为您可能会在数据到达之前切换选项卡,这将触发第二个请求。

解决这个问题的好方法是使用服务。服务可以缓存承诺并将其返回给下一个调用者。

.factory("fooSvc", function($http){
  var promise;
  return {
    getData: function(){
       if (promise) return promise;
       promise = $http.get("/some/url").then(function(response){
         // optionally post-process the response
         return response.data;
       });

       return promise;
    }
  }
})

然后,在控制器中,您可以直接获取数据,而不必担心重复调用:

.controller("TabCtrl1", function($scope, fooSvc){
   fooSvc.getData().then(function(data){
     $scope.data = data;
   })
}
New Dev
2015-05-12