首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS / JavaScript -值应用于数组中的所有JSON

AngularJS / JavaScript -值应用于数组中的所有JSON
EN

Stack Overflow用户
提问于 2017-04-10 14:48:45
回答 3查看 75关注 0票数 1

故事:

我创建了一个数组($scope.mainArray),它将使用如下所示的<table> <tr>来表示:

代码语言:javascript
复制
+---+
| 1 |
+---+
| 2 |
+---+
| 3 |
+---+

在每个对象内部都有一个数组,它在<td>中使用ng-repeat表示,如下所示:

代码语言:javascript
复制
+---+-----+-----+-----+
| 1 | 1-1 | 1-2 | 1-3 |
+---+-----+-----+-----+
| 2 | 2-1 | 2-2 | 2-3 |
+---+-----+-----+-----+
| 3 | 3-1 | 3-2 | 3-3 |
+---+-----+-----+-----+

每个<td>都是一个布尔变量。如果是true<td>的背景色将变成绿色。否则,默认背景。

问题:

每当我将1 boolean转换为true时,该专栏中的所有<td>都会变成绿色。代码$scope.mainArray[0].subArray[0].isGreen = true;将单元格1-1转换为绿色,这使得2-13-1都变成绿色。

SSCCE:

柱塞: https://plnkr.co/edit/9q3PMO?p=preview

所以片段:

代码语言:javascript
复制
angular.module("App", [])

  .controller("Controller", function($scope) {
    var initSubArray = function() {
      var data = [{
        "value": 1,
        "label": 1,
        "isGreen": false
      }, {
        "value": 2,
        "label": 2,
        "isGreen": false
      }, {
        "value": 3,
        "label": 3,
        "isGreen": false
      }];

      return data;
    };

    var initMainArray = function() {
      var data = [{
        "value": 1,
        "label": 1
      }, {
        "value": 2,
        "label": 2
      }, {
        "value": 3,
        "label": 3
      }];

      return data;
    };

    var putSubArray = function() {
      var subArray = initSubArray();
      for (i = 0; i < $scope.mainArray.length; i++) {
        $scope.mainArray[i].subArray = subArray;
      }
    };

    $scope.init = function() {
      $scope.mainArray = initMainArray();
      putSubArray();
      $scope.mainArray[0].subArray[0].isGreen = true;
    };
  });
代码语言:javascript
复制
table {
  border-collapse: collapse;
}

td {
  border: solid;
}

.green {
  background-color: #00FF00;
}
代码语言:javascript
复制
<!DOCTYPE html>
<html>

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.1/angular.js"></script>
</head>

<body ng-app="App" ng-controller="Controller" ng-init="init()">
  <table>
    <tr ng-repeat="foo in mainArray">
      <td>
        {{foo.label}}
      </td>
      <td ng-repeat="bar in foo.subArray" ng-class="{'green' : bar.isGreen}">
        {{foo.label}}-{{bar.label}}
      </td>
    </tr>
  </table>
</body>

</html>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-10 15:03:09

问题是,您正在引用subArray对象。这意味着,当您从subArray中的一个元素更改mainArray时,原始对象也会被更改。

来自subArray中其他元素的mainArray对象也将被更改。为了避免这种情况,我建议您在angular.copy函数中使用putSubArray:

代码语言:javascript
复制
var putSubArray = function() {
    var subArray = initSubArray();
    for(i = 0; i < $scope.mainArray.length; i++ ) {
        $scope.mainArray[i].subArray = angular.copy(subArray);
    }
};

我还更新了你的柱塞

您可以看到一个更详细的解释,这里

票数 0
EN

Stack Overflow用户

发布于 2017-04-10 14:57:39

只需替换下面的函数,查找代码片段即可。另外添加了angular.copy以避免引用。

演示

代码语言:javascript
复制
var putSubArray = function() {
    var subArray = initSubArray();
    for(i = 0; i < $scope.mainArray.length; i++ ) {
        $scope.mainArray[i].subArray = angular.copy(subArray);
    }
};
票数 6
EN

Stack Overflow用户

发布于 2017-04-10 14:56:36

问题是您只有一个subArray对象。你也有三份参考资料。当您进行更改时,您正在更改所有行正在使用的subArray。

您可以通过更改以下内容来解决这个问题:

代码语言:javascript
复制
var putSubArray = function() {
    var subArray = initSubArray();
    for (i = 0; i < $scope.mainArray.length; i++) {
        $scope.mainArray[i].subArray = subArray;
    }
};

代码语言:javascript
复制
var putSubArray = function() {
    for (i = 0; i < $scope.mainArray.length; i++) {
        var subArray = initSubArray();
        $scope.mainArray[i].subArray = subArray;
    }
};

或者是更整洁的变体

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43326326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档