Можно ли передать тип компоненту Angular, который может "обновиться"?

Я разрабатываю общий раскрывающийся компонент. Если пользователь вводит значение, которого нет в списке, я хочу вернуть новый объект того же типа в событии itemSelected. Мне нужно сохранить как методы, так и свойства, поэтому просто создание универсального объекта не сработает. Это должно работать, даже если список пуст, поэтому не получится сделать что-то вроде Object.create(this.list[0]);

Моя работа до сих пор заключается в том, чтобы просто передать ссылочный объект, который я МОГУ использовать с Object.create, но это кажется неуместным.

Следующий фрагмент показывает, что я пытаюсь сделать. Есть ли способ сделать это или лучший способ делать то, что я хочу? Спасибо - Джон

import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'app-generic-new',
  templateUrl: './generic-new.component.html',
  styleUrls: ['./generic-new.component.scss']
})
export class GenericNewComponent implements OnInit {
  ngOnInit(): void {}

  @Input() type:any 

  createNewType():any {
    // this is what I'm trying to do - but doesn't work
    return new this.type();
  }
}

1 ответ

Решение

Использование дженериков

class container<T> {
    id: T;
    key: T;
    displayValue: T;
    type : T;        
}
//allows you to control the type, here we are allowing any, but could be person, address etc.
let myContainer = new container<any>();
myContainer.id = 0;
myContainer.key = "UserEnteredKey";
myContainer.displayValue = "UserEnteredDisplayValue;
myContiner.type //allow access to anything or a specific class type.

Не использовать дженерики.

class container{
 id:number;
 key:number;
 displayValue:string;
 type:any;
}
let myContainer = new contaier();
myContainer.number = 10;
myContainer.key = "UserEnteredKey";
myContainer.displayValue = "User Entered Display Value";
myContainer.type = {key:myContainer.key, display: myContainer.displayValue, doSomething: function(){//do something here.}}

Обратите внимание, что любое из приведенных выше значений может быть вычислено вместо того, чтобы быть статическим, например, обычно вычисляются идентификаторы.

 @Input() type:container

  createNewType():any {
    // this is what I'm trying to do - but doesn't work
    return
     let myContainer = new container<any>();
     myContainer.id = this.getNextID();
     myContainer.key = "UserEnteredKey";
     myContainer.displayValue = "UserEnteredDisplayValue;
     myContiner.type //allow access to anything or a specific class type.
}

Ваша форма должна будет предоставить все свойства, которые пользователь должен изменить через привязку к этой модели касс.

Другие вопросы по тегам