Я не уверен, что справочная переменная dom #chiplist является проблемой. Похоже, что matChipList поддерживается массивом typesOptions, но у вас есть только один массив. Поэтому каждый раз, когда вы добавляете компонент matChipList, он все еще поддерживается тем же массивом, что и все остальные. Вам нужно иметь массив typesOptions, массив массивов. Затем, когда вы добавляетеItem, вы также помещаете новый подмассив в typesOptions (и аналогично удаляете один для removeItem).
Я не закодировал это, просто предложение взглянуть на код.
Редактировать - закодировать решение на основе стекаблика Джеймса.
https://stackblitz.com/edit/angular-3od6rd-jkidxf
Примечание. Я не рассматривал подробно, как объединяется вариант удаления, в идеале я, вероятно, хотел бы использовать пару ключ / значение для отслеживания вариантов варианта, используя идентификатор элемента ввода dom в качестве ключа (который находится в MatChipInputEvent) вместо того, чтобы полагаться на индекс внешнего цикла.
Некоторый код из стекаблиц:
export class ChipsOverviewExample {
productGroup: FormGroup;
variantsArray: FormArray;
typesOptionsArray: string[][] = [];
readonly separatorKeysCodes: number[] = [ENTER, COMMA];
constructor(private fb: FormBuilder) {}
ngOnInit() {
this.productGroup = this.fb.group({
name: '',
variants: this.fb.array([
this.fb.group({
type: '',
options: ''
})
]),
});
this.typesOptionsArray.push([]);
}
saveProduct(form: FormGroup) {
console.log(form);
}
// Add new item to FormArray
addItem(): void {
this.variantsArray = this.productGroup.get('variants') as FormArray;
this.variantsArray.push(this.fb.group({
type: '',
options: ''
}));
this.typesOptionsArray.push([]);
}
removeItem(index: number) {
this.variantsArray.removeAt(index);
}
addOpt(event: MatChipInputEvent, index: number): void {
const input = event.input;
const value = event.value;
// Add our fruit
if ((value || '').trim()) {
this.typesOptionsArray[index].push(value.trim());
}
// Reset the input value
if (input) {
input.value = '';
}
}
removeOpt(opt: string, index: number): void {
const optIndex = this.typesOptionsArray[index].indexOf(opt);
if (optIndex >= 0) {
this.typesOptionsArray[index].splice(optIndex, 1);
}
}
}