为Angular中的选择下拉列表创建新对象

时间:2017-09-28 17:56:08

标签: html angular

这是我的问题的简化版本,因为我的模型要大得多。

我从一组对象生成一个下拉列表,并使用每个对象的object.Name属性来填充选择。

<md-select [(ngModel)]="selectedDetachment" placeholder="Select a detachment">
    <md-option *ngFor="let option of detachmentOptions" [value]="option">
        {{option.Name}}
    </md-option>
</md-select>

detachmentOptions对象是一组生成的3个对象,所有对象都扩展为Detachment

private detachmentOptions: Detachment[];

this.detachmentOptions = [
    new DetachmentPatrol(),
    new DetachmentBattalion(),
    new DetachmentBrigade()
];

我想基于select使用以下函数为我的主军添加一个分队

addDetachment() {
    if(this.selectedDetachment) {
        this.army.Detachments.push(this.selectedDetachment.constructor());
        // this.makeDetachmentOptions();
    }
}

我的问题是,这使用了orignal,因为JS通过引用非常传递。无论我添加了多少DetachmentBattaliion个副本,它们都包含相同的内容,因为它们都是对构造函数中创建的原始内容的引用。

我需要能够创建一个所选类型的全新空白对象,而且我完全不知道如何做到这一点。

Object.prototype()获取原型,因此我无法获得该类型,而且我无法找到使用typeof来生成对象的新副本的方法。< / p>

它不需要复制对象批发,我只需要一种创建原始类型的方法,而不需要通过引用将它们绑在一起。

2 个答案:

答案 0 :(得分:1)

您可以使用lodash的cloneDeep。它创建一个新的对象实例,而不是引用同一个对象。

import { cloneDeep } from 'lodash';

...

export class ... {
  private detachmentOptions: Detachment[];

  ...


  addDetachment() {
    if(this.selectedDetachment) {
      const selectedDetachment = cloneDeep(this.selectedDetachment);
      this.army.Detachments.push(selectedDetachment.constructor());
      // this.makeDetachmentOptions();
    }
  }
}

答案 1 :(得分:0)

你可以在下面试试,

 addDetachment() {
    if(this.selectedDetachment) {
      const prototype = Object.getPrototypeOf(this.selectedDetachment);
      const instance = Object.create(prototype);
      this.army.Detachments.push(instance);
      console.log(instance);
      console.log(this.army);
    }
  }

选中此Plunker!!

希望这会有所帮助!!