我正在努力使这个工作:
$http.post('/route/path', {'username': $scope.threadedUsers[currentIndex].name}).
success(function(data) {
$scope.threadedUsers[currentIndex].ID = data._id;
$scope.threadedUsers[currentIndex].pic = data.profile_picture[0];
}).
error(function(data) {
//error stuff here
});
美元范围。threaddusers是一个动态填充的JSON对象数组所以美元范围。threadedUsers[0] ={"ID":"‘图片’:","消息":[],"lastTimestamp":"}
currentIndex是一个局部变量,它指向$作用域的哪个索引。
当前正在操作的threaddusers数组。问题是在success匿名函数中,currentIndex在一个新的作用域中。现在我可以把currentIndex放在$scope中,但考虑到这是唯一的原因,这似乎是不好的做法。
是否有一个外部值传递给成功回调函数(为索引)?还是使currentIndex成为$scope变量的唯一方法?
你遇到了javascript for/while循环的一个非常常见的问题/误解,它是同步和异步函数。当异步函数(在本例中是HTTP post回调函数)执行时,同步循环已经运行到完成,循环计数器变量已经处于最后的结束值。
只需将代码重构为处理单个用户的helper方法。
function updateUser($scope, user) {
$http.post('/route/path', {'username': user.name}).
success(function(data) {
user.ID = data._id;
user.pic = data.profile_picture[0];
}).
error(function(data) {
//error stuff here
});
}
//Here's the code you omitted but is essential to your question
var updateInScope = updateUser.bind(null, $scope);
$scope.threadedUsers.forEach(updateInScope);
问题的发生似乎是因为currentIndex
在某个for循环中。
有很多方法可以避免它,其中之一就是像Peter Lyons那样重构代码。
另一种选择,您可以像这样记住闭包中的currentIndex
:
(function (rememberedIndex) {
$http.post('/route/path', {'username': $scope.threadedUsers[rememberedIndex].name}).
success(function(data) {
$scope.threadedUsers[rememberedIndex].ID = data._id;
$scope.threadedUsers[rememberedIndex].pic = data.profile_picture[0];
}).
error(function(data) {
//error stuff here
});
}(currentIndex));
实际上,您也可以使用相同的变量名称currentIndex
,但它可能会对稍后看到代码的人造成混淆。
(function (currentIndex) {
$http.post('/route/path', {'username': $scope.threadedUsers[currentIndex].name}).
success(function(data) {
$scope.threadedUsers[currentIndex].ID = data._id;
$scope.threadedUsers[currentIndex].pic = data.profile_picture[0];
}).
error(function(data) {
//error stuff here
});
}(currentIndex));