Angular js-当我在一个范围变量中进行更改时,它也会更改其他范围变量

时间:2016-03-18 10:35:22

标签: javascript angularjs

根据标题,我已将我的代码上传到小提琴这里是链接访问
https://jsfiddle.net/owze1rcj/ 当我更改myAppObjects变量时。变化也反映在其他变量中。 这是我的代码
(HTML部分)

<div ng-controller="MyCtrl">
    <table>
    <tr ng-repeat="appObj in myAppObjects">
        <td>{{appObj.id}}
            <input type="checkbox" ng-model="appObj.cb1"></td>
        <td><input type="checkbox" ng-model="appObj.cb2"></td>
        <td><input type="checkbox" ng-model="appObj.cb3"></td>
        <td><input type="checkbox" ng-model="appObj.cb4"></td>
        <td><input type="checkbox" ng-model="appObj.cb5"></td>
    </tr>
    </table>
    <pre>
   first {{myAppObjects | json}}
    second {{AppObjects | json}}
    </pre>

</div>

(控制器部分)

function MyCtrl($scope) {
    var a =[
        {
        id: 1,
        cb1: true,
        cb2: false,
        cb3: true,
        cb4: true,
        cb5: false
        }];

    $scope.myAppObjects = a;
    $scope.AppObjects = a;


}

2 个答案:

答案 0 :(得分:2)

首先了解深拷贝和浅拷贝的概念

浅拷贝

  

Shallow copy具有顶级对象并指向同一个对象。

因此,当您直接将一个范围变量复制到其他时,会创建一个浅层副本

  $scope.firstVar = $scope.secondVar;

此处,firstVarsecondVar在上面的示例中相互连接。

深层复制

  

Deep copy包含所有级别的复制对象的所有对象,并指向不同的对象。

angular.copy 创建源的深层副本,它应该是一个对象或一个数组。

$scope.firstVar = angular.copy($scope.secondVar);

此处,firstVarsecondVar都是两个不同的变量。

答案 1 :(得分:1)

function MyCtrl($scope) {
var a =[
    {
    id: 1,
    cb1: true,
    cb2: false,
    cb3: true,
    cb4: true,
    cb5: false
    }];

$scope.myAppObjects = angular.copy(a);
$scope.AppObjects = angular.copy(a);
}

使用angular.copy()方法分配值,它不会复制变量引用