我在我的应用程序中使用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
});
所以问题是,如何知道query
和get
请求何时结束?
作为这个问题的旁注,我一直在使用angularjs 1.0.7
答案 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)。
答案 2 :(得分:0)
正如 Pointy 在评论中留下的那样,我解决了我的问题,为get函数提供了第二个参数,如下所示:
$scope.datails = ClientsDetails.get({
date:$scope.selectedId
}, function(){
// do my stuff here
});