AngularJS服务请求结束后执行功能

时间:2013-11-27 22:32:35

标签: angularjs angularjs-service

我在我的应用程序中使用AngularJS Services从后端检索数据,我想制作一个加载掩码,因此加载掩码将在发送请求之前启动。但我怎么知道请求何时结束?


例如,我将我的servive定义为:

angular.module('myServices', ['ngResource'])
    .factory('Clients', function  ($resource) {
        return $resource('getclients');
    })
    .factory('ClientsDetails', function  ($resource) {
        return $resource('getclient/:cltId');
    })

所以我在控制器中使用它们:

$scope.list = Clients.query();

$scope.datails = ClientsDetails.get({
    date:$scope.selectedId
});

所以问题是,如何知道queryget请求何时结束?


编辑:

作为这个问题的旁注,我一直在使用angularjs 1.0.7

3 个答案:

答案 0 :(得分:3)

在AngularJS 1.2中,除非您为其启用特殊功能(并且无法确定可用的时间长度),否则不再支持自动展开承诺。

这意味着如果你写一个这样的一行:

$scope.someVariable = $http.get("some url");

当您尝试在视图代码中使用someVariable时(例如,“{{someVariable}}”),它将不再起作用。而是将函数附加到你从dawuut显示的get()函数返回的promise中,并在success函数中执行范围分配:

$http.get("some url").then(function successFunction(result) {
  $scope.someVariable = result;
  console.log(result);
});

我知道你可能把你的$ http.get()包装在某种服务或工厂里面,但是你可能已经传递了你使用$ http从你的包装上的函数中得到的承诺所以这个适用于那里。

关于AngularJS承诺的旧博客文章相当受欢迎,它还没有更新的信息,你不能再直接将承诺分配到$ scope并期望它适合你:http://johnmunsch.com/2013/07/17/angularjs-services-and-promises/

答案 1 :(得分:1)

您可以使用承诺进行管理,例如:

Clients.query().then(function (res) {
    // Content loaded
    console.log(res);
}, function (err) {
    // Error
    console.log(err);
});

另一种方式(非常强大且“最佳实践”)是让Angular使用拦截器自动拦截您的请求(请参阅此处的文档:http://docs.angularjs.org/api/ng.$http)。

这也有帮助:Showing Spinner GIF during $http request in angular

答案 2 :(得分:0)

正如 Pointy 在评论中留下的那样,我解决了我的问题,为get函数提供了第二个参数,如下所示:

$scope.datails = ClientsDetails.get({
    date:$scope.selectedId
}, function(){
    // do my stuff here
});