AngularJS如何使用动态密钥和$ http响应更新JSON值?

时间:2016-01-20 21:33:01

标签: angularjs json

我有这个JSON示例:

  $scope.channels = {
    "ch1": {
      id: "ch1",
      data: {}
    },
    "ch2": {
      id: "ch2",
      data: {}
    }
  };

QUE 1

如何使用动态密钥更新data: {}部分? 类似的东西:

  for ( var c in $scope.channels ) {
    $http.get(JSON_PATH + c + '.json').then(function(res){
      // DOES NOT WORK
      $scope.channels[c]["data"] = res.data;

      // ALSO DOES NOT WORK
      var section = $scope.channels[c];
          section.data = res.data;
      $scope.channels[c] = section;
    });
  }

$scope.channels的结果现在是 new 部分,名为" data"而不是在键= =" ch1" (即)。

另外,Sublime Text 3也发出警告,我不知道为什么? (它不像我使用this或其他东西: 181 don't make functions within a loop

QUE 2

我通过实际创建一个外部函数并在循环中调用它来解决上述问题。

所以我想知道为什么Que1中的上述代码不起作用,而这样做:

function load_data(id) {
 $http.get(JSON_PATH + c + '.json').then(function(res){
   var section = $scope.channels[c];
   var section.data = res.data;

   $scope.channels[c] = section;   // WORK
   });
}

for ( var c in $scope.channels ) {
  load_data(c);
}

1 个答案:

答案 0 :(得分:1)

在Que 1中,for循环继续循环,而$ http方法是异步处理。 " c"变量失去了它的原始背景和价值。我相信一旦for循环完成就会被破坏。

在Que 2中," c"现在是" id",并且作为静态值传入,无论异步活动如何,它都将继续可用于函数闭包内的任何内容。该函数引用了" c"并且不再关心循环是否会破坏它。

这与函数闭包有关,需要有更好理解的人详细解释。

你应该改变" c"到" id"在Que 2中,在你的功能中。

另外,作为半相关的注意事项,如果要循环一系列$ http调用,您可能需要查找$ q.all文档并阅读有关如何构建promise数组的信息,您可以在其中进行检测解决所有呼叫,而不仅仅是单个呼叫。它非常有用。