【问题标题】:How to process asynchronously fetched data?如何处理异步获取的数据?
【发布时间】:2015-03-23 02:36:59
【问题描述】:

我是 AngularJS 的新手,正在努力解决如何处理从服务器异步获取的数据,然后再将其显示在页面上。

我正在获取的数据是这样的:

"all_colors":[
      {"color":"red","quantity":1},
      {"color":"green","quantity":11},
      {"color":"yellow","quantity":5}
]

当页面最初加载时,我从服务器获取上述数据,如下所示:

angular.module('angularDjangoRegistrationAuthApp')
.controller('DashbordCtrl', function ($scope, djangoAuth, Validate, $location) {
  djangoAuth.fetch_from_server().then(function(data){
    $scope.model = data;
  });

我想在页面上显示两件事:

Available Colors: 3
Total Color Quantity: 17 

我可以像这样显示可用的颜色:

Available Colors: {{model.all_colors.length}}

问题

但是如何循环 all_colors 并计算每个颜色的数量,以便我可以显示 Total Color Quantity

获取数据后,我似乎无法在我的 JS 文件中执行此操作,因为它是异步获取的。我无法弄清楚如何做到这一点。

【问题讨论】:

标签: javascript angularjs asynchronous angularjs-scope


【解决方案1】:

无论您如何获取数据,只要考虑您需要显示哪些数据 - 您的 ViewModel - 并在获取数据时为它们分配值。

在这种情况下,创建一个作用域公开属性$scope.totalColorQty,并在收到数据时为其赋值:

djangoAuth.fetch_from_server().then(function(data){
    $scope.model = data;
    $scope.totalColorQty = computeColorQuantity(data.all_colors);
});

function computeColorQuantity(colorsArray){
  // do whatever you need to calculate the quantity
}

然后,只需在 UI 中显示它:

<div>Total Color Quantity: 
   <span ng-show="totalColorQty === undefined">Loading...</span>
   <span ng-hide="totalColorQty === undefined">{{totalColorQty}}</span>
</div>

一些补充说明:

1) 您可以在作用域上公开computeColorQuantity 并绑定到该作用域。但是,我强烈建议不要这样做 - 因为这个操作是“繁重的”,并且会在每个摘要周期执行,从而使您的整个应用程序变慢。

不要这样做:

<div> Total Color Quantity: {{computeColorQuantity(model.all_colors)}}</div>

2) 如果你不需要重新计算这个值,那么你可以绑定一次来减少 $watchers 的数量:

<span ng-show="totalColorQty">{{::totalColorQty}}</span>

3) 如果您确实打算允许用户更新数据,那么我建议在每次用户发起的更改时重新计算它,例如,通过ng-change,而不是通过 deep $watch

【讨论】:

  • 非常感谢您的建议。现在,我将采用您建议的computeColorQuantity 方法。虽然我不会这样做 1) 我不明白 2) 和 3) 是什么意思,因为这是我使用 AngularJs 的第二天。我确实希望这些数据会随着用户提出请求而不断变化。
  • 别担心(2)。 (3) 仅适用于您打算在表单中显示数据并让用户在页面上对其进行编辑的情况。如果数据仅通过异步获取进行更改,那么每次获取数据时重新计算totalColorQty 就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2021-09-26
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多