无法为JavaScript中的对象变量赋值

时间:2017-02-16 05:19:09

标签: javascript jquery angularjs arrays object

我正在尝试读取角度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;。但它没有发生。请帮帮我

4 个答案:

答案 0 :(得分:2)

将您的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";
  });
}

答案 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