如何在Angularjs中保持变量不变

时间:2015-12-01 19:02:24

标签: angularjs

尝试在AngularJS脚本中将一个变量值分配给另一个$ scope变量(或正常变量),之后不修改其中任何一个。但是我看到变量值都会自动更改 - 在上面的赋值之后,对其他一些变量进行了修改。 为什么未修改的变量(“d”和“$ scope.dataset_d_final”)会自动更改? 我该如何预防?

我有以下AngularJS代码

<script>
var app = angular.module('ExampleApp', ['ui.plot']);
app.controller('PlotCtrl', function ($scope) 
 {
    'use strict';
    $scope.sname = "Tttt";
    $scope.dataset_v = {
     "d0": { "id": 0, "name": "Housing", "value": 18 }, 
     "d1": { "id": 1, "name": "Travel", "value": 31.08 },
     "d2": { "id": 2, "name": "Restaurant", "value": 64 },
     "d3": { "id": 3, "name": "Bank", "value": 3 },
     "d4": { "id": 4, "name": "Movies", "value": 10 }
                       };

    $scope.dataset_final={};

    $scope.assign = function () 
    {
        var dataset=$scope.dataset_v;
        // Declare resulting empty array

        var d = [];
        // Get object keys and iterate over them
          Object.keys(dataset).forEach(function (key)  
          {
            // Get the value from the object
            var value = dataset[key].value;
            // Update values if in the range
            if(value >= 10 && value <= 20) {
               dataset[key].value = 7;
            } else if(value > 20 && value <= 40) {
               dataset[key].value = 8;
            }
             d.push(dataset[key]);

            $scope.dataset_d_final = d;  // THIS IS THE ASSIGNMENT
         // "$scope.dataset_d_final" and "d" variables gets changed even after performing no modification later in the code


             //  REVERSING
            var dataset1 = $scope.dataset_v;
            var d1 = [];

            Object.keys(dataset1).forEach(function (key) {
                // Get the value from the object
                var value = dataset1[key].value;
                // Update values if in the range
                if (value == 2) {
                    dataset1[key].value = 1;
                } else if (value == 3) {
                    dataset1[key].value = 4;
                }
                d1.push(dataset1[key]);
            });
            alert('Final');
            alert(JSON.stringify($scope.dataset_d_final, null, 4));
            alert(JSON.stringify(d, null, 4));  // Both got changed as per above function

 });
</script>

我对变量“d”和“$ scope.dataset_d_final”的最后警告不应该改变..我该怎么做?

我想通过$ http服务向服务器发布d或$ scope.dataset_d_final数据。

1 个答案:

答案 0 :(得分:0)

当您将一个对象值分配给另一个对象时,两者都获得与对象相同的引用是引用类型

像     var a = {prop1:0,prop2:0},b = {}; //都是对象     a = b;     改变任何一个对象都会在两个方面做出改变

@'
<form method="GET" action="http://localhost/index.php" name="head2">
    <input type="hidden" name="akcja" value="szukaj">
...
</form>
'@

为了避免此类问题,您可以使用a.prop1 = 1; a.prop2 = 2; console.log("Output: - ",b); // Output: - {prop1: 1, prop2: 2}; ,它将通过克隆该对象为该值分配不同的引用。

angular.copy