angular - 如何在不使用 JQuery 函数的情况下以 angular 4 进行深度复制?

标签 angular typescript clone deep-copy

<分区>

我有一个英雄数组,我通过 *ngFor 在列表中显示它,当我单击其中一个元素时,它复制到新变量上,新变量通过双向绑定(bind)进入输入。 我的英雄类:

export class Hero {
    id: number;
    name: string;
  } 

我的英雄模拟列表:

import { Hero } from './heroClass';

export const HEROES: Hero[] = [
  { id: 11, name: 'Mr. Nice' },
  { id: 12, name: 'Narco' },
  { id: 13, name: 'Bombasto' },
  { id: 14, name: 'Celeritas' },
  { id: 15, name: 'Magneta' },
  { id: 16, name: 'RubberMan' },
  { id: 17, name: 'Dynama' },
  { id: 18, name: 'Dr IQ' },
  { id: 19, name: 'Magma' },
  { id: 20, name: 'Tornado' }
];

我的英雄组件:

   import { Component, OnInit } from '@angular/core';
    import { Hero } from '../hero';
    import { HEROES } from '../mock-heroes';

    @Component({
      selector: 'app-heroes',
      templateUrl: './heroes.component.html',
      styleUrls: ['./heroes.component.css']
    })
    export class HeroesComponent implements OnInit {

      heroes = HEROES;

      selectedHero: Hero;


      constructor() { }

      ngOnInit() {
      }

      onSelect(hero: Hero): void {
        this.selectedHero = hero;
      }
    }

heroes.component.html

<h2>My Heroes</h2>
<ul class="heroes">
  <li *ngFor="let hero of heroes"
    [class.selected]="hero === selectedHero"
    (click)="onSelect(hero)">
    <span class="badge">{{hero.id}}</span> {{hero.name}}
  </li>
</ul>

<div *ngIf="selectedHero">

  <h2>{{ selectedHero.name | uppercase }} Details</h2>
  <div><span>id: </span>{{selectedHero.id}}</div>
  <div>
    <label>name:
      <input [(ngModel)]="selectedHero.name" placeholder="name">
    </label>
  </div>

</div>

问题是当我选择一个英雄并在文本输入中显示它的副本并将其更改时,所选列表的英雄也会发生变化。

在 angularjs 1 中,我通过使用 angular.copy() 内置方法来防止这个问题,但在 angular 2 中,我必须创建新的 Hero 并将 selectedHero 的属性归因于主要英雄:

  selectedHero: new Hero();
onSelect(hero: Hero): void {
        this.selectedHero.name = hero.name;
         this.selectedHero.id= hero.id;
      }

是否有其他方法可以在不使用 jquery 或 js 函数及以上方法的情况下在 angular 2 中进行深度复制?

最佳答案

在我看来,这非常 hacky,但它确实有效。

this.selectedHero = JSON.parse(JSON.stringify(hero));

对于浅拷贝: 您可以使用 spread运算符(operator):

this.selectedHero = {...hero};
let {...example} = hero;

关于angular - 如何在不使用 JQuery 函数的情况下以 angular 4 进行深度复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47852998/

相关文章:

javascript - 非主文件的输入

reactjs - 类型中缺少不应手动传递给子组件的属性

jquery - 克隆()不工作互联网浏览器8

angular - 如何从 ag-grid valueFormatter 调用服务

javascript - 将div分成2列

css - angular2 material md-radio垂直

javascript - 当路由参数和地址无效时,Angular 2不会重定向到404页面

抽象类中的c++克隆函数

javascript - 获取没有特定属性的对象

node.js - 在 Visual Studio 2015 中右键单击时缺少“还原包”选项