2

从后端加载资源后,我想执行一些代码。我可以通过对一个资源请求使用回调来做到这一点,如下所示:

$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 
});

我究竟做错了什么?

4

2 回答 2

13

来自Angular 文档

重要的是要意识到调用 $resource 对象方法会立即返回一个空引用(对象或数组取决于 isArray)。从服务器返回数据后,现有参考将填充实际数据。这是一个有用的技巧,因为通常将资源分配给模型,然后由视图呈现。拥有一个空对象不会导致渲染,一旦数据从服务器到达,那么该对象就会被数据填充,并且视图会自动重新渲染自身以显示新数据。这意味着在大多数情况下,我们不必为操作方法编写回调函数。

这里的关键点是,您传递的对象不是承诺。

承诺是一种表示您正在等待某事先完成的方式。它是 ajax 的支柱,如果您不熟悉,我建议您阅读它。

要使 $q 工作,您需要提供承诺而不是对象或引用

来自相同的文档

Resource 实例和集合具有以下附加属性:

$promise:创建此实例或集合的原始服务器交互的承诺。

成功后,promise 将使用相同的资源实例或集合对象解析,并使用来自服务器的数据进行更新。这使得在 $routeProvider.when() 的 resolve 部分中很容易使用来延迟视图渲染,直到加载资源。

失败时,使用 http 响应对象解决承诺,没有资源属性。

$resolved:第一次服务器交互完成后为真(成功或拒绝),在此之前为假。知道资源是否已被解析在数据绑定中很有用。

所以你需要做类似的事情

$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 
});
于 2013-11-13T04:14:58.993 回答
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 
});
于 2013-11-13T04:07:33.893 回答