-1

我通过http调用和订阅获取json数据: -

this.localService.getdata('url').subscribe(
function (success) {
    this.dataa = success;
    this.dataa2 = success;
}
);

stackblitz 链接:- https://stackblitz.com/edit/angular-stackblitz-json-xr7ny8?file=src/app/app.component.ts

1)data.json分配给变量dataa2 的值发生了变化,并且当方法get2()被调用时,dataa2值正在发生变化。同时,变量相同test2

2)如何在给定情况下存储data.json变量(例如dataa2- )而不改变其值。

3)为什么我不能在不改变它们的值的情况下将成功存储在两个变量中。如何
在不相互影响的情况下将成功数据存储在两个变量中。我是否每次都需要订阅才能获取 json 数据的副本?

数据.json

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

.html

<button type ="button" (click)="get()">tset</button>
<br/>
<br/>
<br/>
<button type ="button" (click)="get2()">tset2</button>

.ts

import { data } from './test';

export class AppComponent implements OnInit {
  name = 'Angular';
  dataa:any;
  dataa2:any;

  test ={
    'id':'abc'
  }

  test1:any;
  test2:any;
  constructor() {
  }

     ngOnInit() {
         this.dataa =  data;
        this.dataa2 =  data;

        this.test1 =  this.test;
         this.test2 =  this.test;
     }

  get(){
    this.dataa['userId'] = 2;
     this.dataa['id'] = 2;

      this.test1['id'] = 'I am changed';
  }


  get2(){
    console.log(JSON.stringify(this.dataa));
      console.log(JSON.stringify(this.dataa2));
  // should be===>  this.dataa2 =  {
   //           "userId": 1,
   //            "id": 1,
   //          "title": "delectus aut autem",
   //        "completed": false
   //           }
      console.log(JSON.stringify(this.test1));
      console.log(JSON.stringify(this.test2));
  }
}
4

1 回答 1

0

在 javascript 中为变量赋值时,变量会保留它自己的该值的副本。当您将对象分配给变量时,情况并非如此。

如果将同一个对象分配给 2 个变量,则引用该对象的所有变量都将看到对象属性的任何更改。

创建可以单独操作属性的对象副本的方法如下:

this.dataa2 = Object.assign({}, this.dataa);
于 2019-01-16T17:51:42.133 回答