2015-12-01 1 views
0

J'essaie d'affecter une valeur de variable à une autre variable $ scope (ou une variable normale) dans le script AngularJS, et de ne modifier aucune d'entre elles après cela. Mais je vois que les deux variables sont changées automatiquement - Il y a des modifications pour d'autres variables après l'affectation ci-dessus. Pourquoi mes variables ("d" et "$ scope.dataset_d_final") qui ne sont pas modifiées sont-elles automatiquement modifiées? Comment puis-je l'empêcher?Comment obtenir une variable inchangée dans Angularjs

Je AngularJS ci-dessous le code

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

Ma dernière alerte pour les variables "d" et "scope.dataset_d_final de $" ne doit pas être changé .. comment puis-je faire?

Je souhaite publier des données d ou $ scope.dataset_d_final sur le serveur via le service $ http.

Répondre

0

Lorsque vous attribuez une valeur d'objet à un autre, à la fois obtenir même référence que l'objet sont du type de référence

comme var a = {prop1: 0, PROP2: 0}, b = {}; // les deux sont objets a = b; changement dans tout l'objet apportera des changements dans les deux

a.prop1 = 1; 
a.prop2 = 2; 

console.log("Output: - ",b); // Output: - {prop1: 1, prop2: 2}; 

Pour éviter ce problème, vous pouvez utiliser angular.copy qui attribuera la valeur avec référence différente par clonage de cet objet.

var dataset = angular.copy($scope.dataset_v); //assigning value with different reference. 

//also while REVERSING 
var dataset1 = angular.copy($scope.dataset_v);; 
+0

Salut Pankaj, j'ai essayé angular.copy .. il ne fonctionne pas –

+0

@SathishPanduga avez-vous essayé comme je l'ai suggéré .. Mais –

+0

essaie d'obtenir la valeur d'origine de scope.dataset_d_final $ .. Pourquoi J'utilise angular.copy pour $ scope.dataset_v? Pourriez vous me laisser savoir s'il vous plait ? –