如何处理异步获取的数据?

时间:2015-03-23 02:36:59

标签: javascript angularjs asynchronous angularjs-scope

我是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文件中执行此操作,因为它是异步获取的。我无法弄清楚这样做的方法。

1 个答案:

答案 0 :(得分:3)

无论您如何获取数据,只需考虑您需要显示哪些数据 - 您的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,而不是通过深度$ watch