我有这个JSON示例:
$scope.channels = {
"ch1": {
id: "ch1",
data: {}
},
"ch2": {
id: "ch2",
data: {}
}
};
如何使用动态密钥更新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
我通过实际创建一个外部函数并在循环中调用它来解决上述问题。
所以我想知道为什么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);
}
答案 0 :(得分:1)
在Que 1中,for循环继续循环,而$ http方法是异步处理。 " c"变量失去了它的原始背景和价值。我相信一旦for循环完成就会被破坏。
在Que 2中," c"现在是" id",并且作为静态值传入,无论异步活动如何,它都将继续可用于函数闭包内的任何内容。该函数引用了" c"并且不再关心循环是否会破坏它。
这与函数闭包有关,需要有更好理解的人详细解释。
你应该改变" c"到" id"在Que 2中,在你的功能中。
另外,作为半相关的注意事项,如果要循环一系列$ http调用,您可能需要查找$ q.all文档并阅读有关如何构建promise数组的信息,您可以在其中进行检测解决所有呼叫,而不仅仅是单个呼叫。它非常有用。