【问题标题】:AngularJS - Run code after multiple resources loadAngularJS - 加载多个资源后运行代码
【发布时间】:2013-11-13 12:14:58
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

  • 你怎么知道它不起作用,你的结果数组在哪里?

标签: javascript angularjs resources


【解决方案1】:

来自Angular documentation

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

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

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

要使 $q 正常工作,您需要提供 promise 而不是对象或引用

来自相同的文档

资源实例和集合有这些额外的 属性:

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

【讨论】:

  • 虽然两个答案都是一样的,但我觉得@kelaban 的回答更能说明问题,谢谢!!
【解决方案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 
});

【讨论】:

  • 工作就像一个魅力!谢谢@akonsu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多