【问题标题】:Can't assign values to variables of objects in JavaScript [duplicate]无法为JavaScript中的对象变量赋值[重复]
【发布时间】: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"; - 这一行

标签: javascript jquery angularjs arrays object


【解决方案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值

      【讨论】:

        猜你喜欢
        • 2015-03-24
        • 2017-07-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-28
        • 2021-01-04
        相关资源
        最近更新 更多