我想从后端加载资源后执行一些代码。 我能够通过在一个资源请求上使用回调来实现这一点:
$scope.resrc = Resrc.query({idResource: 1}, function(){
//CODE AFTER RESOURCE IS LOADED
});
但是尝试使用$ q等待MULTIPLE资源加载然后执行代码对我来说不起作用! (正如他们在此提出的https://stackoverflow.com/a/14545803/215945)
$q.all([
$scope.services = Services.query({idResource: 1}),
$scope.brands = Brands.query({idResource: 1})
]).then(function() {
//CODE AFTER RESOURCES ARE LOADED
});
我做错了什么?
答案 0 :(得分:13)
重要的是要意识到调用$ resource对象方法会立即返回一个空引用(对象或数组,具体取决于isArray)。从服务器返回数据后,将使用实际数据填充现有引用。这是一个有用的技巧,因为通常将资源分配给模型,然后由视图呈现。具有空对象导致无渲染,一旦数据从服务器到达,则对象用数据填充,并且视图自动重新呈现其自身显示新数据。这意味着在大多数情况下,永远不必为动作方法编写回调函数。
这里的关键点是,你传递的对象不是承诺。
承诺是一种说法等待某事先完成的方式。它是ajax的支柱,如果您不熟悉,我建议您阅读它。
要使$ q工作,您需要提供承诺而不是对象或引用
来自相同的文档
资源实例和集合具有这些附加功能 属性:
$ promise:创建的原始服务器交互的承诺 这个实例或集合。
成功时,使用相同的资源实例解析promise 集合对象,使用服务器中的数据更新。这很容易 在$ routeProvider.when()的resolve部分中使用来推迟查看 渲染,直到加载资源。
失败时,使用http响应对象解析promise, 没有资源属性。
$ resolved:在第一次服务器交互完成后为true(也就是说 成功或拒绝),之前是假的。知道资源 已经解决的数据绑定很有用。
所以你需要做一些像
这样的事情$scope.services = Services.query({idResource: 1});
$scope.brands = Brands.query({idResource: 1});
$q.all([
$scope.services.$promise,
$scope.brands.$promise
]).then(function() {
//CODE AFTER RESOURCES ARE LOADED
});
答案 1 :(得分:2)
我认为这是因为从$resource
的调用返回的对象不是承诺。我从未使用过此功能,但文档建议
$scope.services = Services.query({idResource: 1});
$scope.brands = Brands.query({idResource: 1});
$q.all([
$scope.services.$promise,
$scope.brands.$promise
]).then(function() {
//CODE AFTER RESOURCES ARE LOADED
});