我正在尝试读取角度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>
但每次我这样做都会引发错误:&#34;无法设置属性&#39;未定义&#34;并显示文件名。即使没有找到文件,也应该将值更新为&#34; NA&#34;。但它没有发生。请帮帮我
答案 0 :(得分:2)
将您的http服务调用包含在下面的另一个函数中,并在循环中调用该函数,以便循环索引i
值将在函数范围内保留。
如果您不想使用单独的功能,也可以使用匿名功能
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))
}
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";
});
}
答案 1 :(得分:1)
在let
循环
for
for (let i = 0; i < 3; i++) {
......
}
参考:
http://caniuse.com/#search=let https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let
答案 2 :(得分:0)
代码是正确的。但对于循环不是。当你将console.log(i)添加到错误函数时,你会看到3.但你的数组有3个成员。 http请求是异步的。 for循环不能等待它的响应。使用Gangadhar Jannu解决方案。
答案 3 :(得分:0)
我认为使用let in for循环是处理此类案例的更好方法。 让循环可以将它重新绑定到循环的每次迭代,确保从前一循环迭代结束时重新分配它,因此可以用它来避免闭包问题
for (let i = 0; i<3;i++) {
}
每当执行for循环中的异步代码时,它将获得正确的i
值