AngularJS - 在多个资源加载后运行代码

时间:2013-11-13 03:48:16

标签: javascript angularjs resources

我想从后端加载资源后执行一些代码。 我能够通过在一个资源请求上使用回调来实现这一点:

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

我做错了什么?

2 个答案:

答案 0 :(得分:13)

来自Angular documentation

  

重要的是要意识到调用$ 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 
});