无法为JavaScript中的对象变量赋值[重复]
Posted
技术标签:
【中文标题】无法为JavaScript中的对象变量赋值[重复]【英文标题】:Can't assign values to variables of objects in JavaScript [duplicate] 【发布时间】:2017-07-05 01:40:00 【问题描述】:我正在尝试读取 Angular js 中的文件,如果成功读取数据,它将将内容分配给对象的变量,否则会将“NA”分配给同一变量。
function customer($scope, $http)
var i;
$scope.courses = [
name: "CSE",
capacity: "CSE.txt"
,
name: "IT",
capacity: "IT.txt"
,
name: "ECE",
capacity: "ECE.txt"
];
for (i = 0; i < 3; i++)
$http.get($scope.courses[i].capacity).then(function (success)
$scope.courses[i].capacity = success.data;
, function (error)
$scope.courses[i].capacity = "NA";
);
var myApp = angular.module("myApp", []);
myApp.controller("customerobj", customer);
我尝试以普通表格格式访问以下部分
<td>ng-repeat="course in courses">course.capacity</td>
但每次我这样做时都会抛出错误:“无法设置未定义的属性‘容量’”并显示文件名。即使找不到文件,也应该将值更新为“NA”。但它没有发生。请帮帮我
【问题讨论】:
尝试将您的 $http.get 包装在函数中。似乎是 javascript 中的闭包问题 @DarshakGajjar 因为错误是“无法设置未定义的属性'容量'”,这表明$scope.courses[i]
是undefined
。而且因为这是循环的一部分,所以在我看来它是我链接的那个的副本
$scope.courses[i] 已经在数组定义中定义了吗?
@SiddharthaChoudhury 你能检查浏览器控制台吗?错误在哪一行抛出?
$scope.courses[i].capacity = "NA"; - 这一行
【参考方案1】:
将您的 http 服务调用包装在另一个函数中,如下所示,并在循环中调用该函数,以便循环索引 i
值将保留在函数范围内。
更新:
如果你不想要一个单独的函数,你也可以使用匿名函数
解决方案 1
for (i = 0; i < 3; i++)
(function (index)
$http.get($scope.courses[index].capacity).then(function (success)
$scope.courses[index].capacity = success.data;
, function (error)
$scope.courses[index].capacity = "NA";
);
(i))
解决方案 2
for (i = 0; i < 3; i++)
serviceCall(i)
function serviceCall(index)
$http.get($scope.courses[index].capacity).then(function (success)
$scope.courses[index].capacity = success.data;
, function (error)
$scope.courses[index].capacity = "NA";
);
【讨论】:
它正在工作。先生,如果您不介意,您能解释一下吗? @SiddharthaChoudhury 它被称为 closure。 如果将函数放在循环之外,每个索引变量都会绑定到函数,否则它们将共享同一个变量。我建议看看closure inside loops 这就是复制的解决方案。相反,您应该投票关闭这个作为骗子...... @Andreas 虽然基本概念相似,但即使我们都发表了评论,OP 也无法理解上下文。然后只有我给出了答案。【参考方案2】:在for
循环中使用let
for (let i = 0; i < 3; i++)
......
参考:
http://caniuse.com/#search=let https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let
【讨论】:
【参考方案3】:代码正确。但 for 循环不是。当您将 console.log(i) 添加到错误函数时,您会看到 3。但您的数组有 3 个成员。 http请求是异步的。 for 循环不能等待它的响应。使用 Gangadhar Jannu 解决方案。
【讨论】:
【参考方案4】:我认为使用 let in for 循环是处理此类情况的更好方法。 循环中的 let 可以将其重新绑定到循环的每次迭代中,确保从上一次循环迭代结束时重新为其分配值,因此可以使用它来避免闭包问题
for (let i = 0; i<3;i++)
每次执行for循环内的异步代码时,都会得到正确的i值
【讨论】:
以上是关于无法为JavaScript中的对象变量赋值[重复]的主要内容,如果未能解决你的问题,请参考以下文章