Я прикрепил ссылку на свой код. Я попытался создать массив формы динамического вложенного дерева. Но я не знаю, как создать. Я новичок в угловых рамках. https://stackblitz.com/edit/angular-vytk36?file=src/index.html
Это много кода. Было бы лучше добавить к вопросу ту часть, которая вызывает у вас затруднения.
Вы хотите создать FormArray из FormAray, посмотрите это ТАК или это другое
@Eliseo Я пытаюсь преобразовать массив в формат дерева структур данных. Можно ли создать массив угловых форм?
Сколько «глубин» у вашей структуры, одна, две, три, неопределенные? Можете ли вы привести пример .json, которым вы хотите управлять?
@Eliseo { "меню": [ { "nestedmenu": [ { "nestedmenu": [ {} ] } ] } ] } уровень без конца... Можно создать?
@Арункумар, конечно! (невозможно ничего), но это немного сложно. Я только что добавил ответ. надеюсь смогу помочь
@Eliseo Я пробовал этот формат { "меню": [ { "nestedmenu": [ { "nestedmenu": [ { "nestedmenu": [], "submenu": [] } ], "submenu": [] } ] , "submenu": [] } ] } Как добавить подменю. Пожалуйста, помогите мне.
Я пытался, но у меня возникла проблема. stackblitz.com/edit/angular-pezmpp?file=src/form.component.ts
Всегда у нас есть "бесконечный уровень" - это работа над "рекурсивным компонентом"
Рекурсивный компонент — это только компонент, который вызывает сам себя (см., например, это ТАК)
Управлять дочерним компонентом, который управляет formGroup от родителя, не очень просто. Мы можем использовать viewProviders или передать FormGroup во входных данных (см. это еще один SO)
Мы собираемся выбрать передать formGroup. Но поскольку наш компонент является рекурсивным компонентом, который нам нужен в группе форм, поэтому я использую другой ввод, который является «именем» группы форм. (помните, что наши formArrays — это formArrays formGroups. Нам нужно «достучаться» до formGroup
Пух...!
Прежде чем мы собираемся определить функцию для создания formGroup. Мы экспортируем его, потому что одна и та же функция может использоваться родителем и компонентом.
export function setNestedMenu(data:any=null){
data=data || {name: "",displayname: "",id: "",nestedMenu: []}
return new FormGroup({
name:new FormControl(data.name),
displayName:new FormControl(data.name),
id:new FormControl(data.name),
nestedMenu:new FormArray(data.nestedMenu.map((x:any)=>this.setNestedMenu(x)))
})
}
ПРИМЕЧАНИЕ. Я использую camelCase, чтобы придать значение «свойствам».
Компонент
@Component({
selector: 'form-component',
standalone: true,
imports: [CommonModule, FormsModule, ReactiveFormsModule],
template: `
<div [style.margin-left.px] = "index*10" *ngIf = "formGroup" [formGroup] = "formGroup" >
<div formArrayName = "nestedMenu">
<button (click) = "addMenu()">add</button>
<div *ngFor = "let group of menuArray?.controls;let i=index"
[formGroupName] = "i">
<input formControlName = "id"/>
<input formControlName = "name"/>
<input formControlName = "displayName"/>
<button (click) = "removeMenu(i)">remove</button>
<button (click) = "addSubMenu(i)">add submenu</button>
<ng-container *ngIf = "getSubMenuArray(i).length">
<!--here we call again to our component-->
<form-component [form] = "form"
[name] = "name+'.'+i+'.nestedMenu'"
[index] = "index+1" ></form-component>
</ng-container>
</div>
</div>
</div>`,
})
export class FormMenuComponent {
_index:number=0;
formGroup:FormGroup
@Input() form: FormGroup;
@Input() name:string = "nestedMenu";
@Input('index') set _(value:number){
this._index=value;
this.formGroup=(value?this.form.get(this.name).parent:this.form) as FormGroup
}
get index()
{
return this._index
}
get menuArray() {
return this.form?this.form.get(this.name) as FormArray:null;
}
getSubMenuArray(index:number){
return this.form.get(this.name+'.'+index+'.nestedMenu') as FormArray
}
addMenu()
{
this.menuArray.push(setNestedMenu())
}
addSubMenu(index:number)
{
this.getSubMenuArray(index).push(setNestedMenu())
}
removeMenu(index:number)
{
this.menuArray.removeAt(index)
}
}
Посмотрите, как передать имя, форму и индексные переменные
Наш main.component просто
<form-component [form] = "form" [index] = "0"></form-component>
form: FormGroup=new FormGroup({
nestedMenu:new FormArray([setNestedMenu()])
})
Смотрите stackblitz
ПРИМЕЧАНИЕ: извините за самоцитирование
Я пробовал модифицировать некоторые настройки. Но у меня возникла проблема. stackblitz.com/edit/angular-pezmpp?file=src/form.component.ts Пожалуйста, помогите мне
я добавил дополнительный массив подменю в этой форме. Но у меня проблема Пожалуйста, помогите мне. Я прикрепил URL-адрес кода. Я не знаю, как исправить эту ошибку. stackblitz.com/edit/angular-pezmpp?file=src/form.component.ts
@Arunkumar, извините за задержку (на прошлой неделе я был очень занят). Я добавил новый ответ, который, надеюсь, поможет
Перед ответом передать в форму две переменные: «форма» и «имя» formArray. Это усложняет компонент. Есть еще один лучший подход, который передает "formGroup".
Во-первых, наш компонент имеет ввод «установщика», например
formGroup:FormGroup
@Input('form') set __(value:AbstractControl){
this.formGroup=value as FormGroup
}
(Необходимо "отлить" управление)
Теперь мы можем использовать что-то вроде
<div *ngIf = "formGroup" [formGroup] = "formgroup">
...
<div formArrayName = "nestedMenu">
<div *ngFor = "let group of nestedMenuArray?.controls;let i=index"
[formGroupName] = "i">
...
<ng-container *ngIf = "getNestedMenuArray(i)?.length">
<!--see we pass as form the "formGroup"-->
<form-component [form] = "nestedMenuArray.at(i)" [index] = "index+1" >
</form-component>
</ng-container>
</div>
</div>
get nestedMenuArray() {
return this.formGroup?this.formGroup.get('nestedMenu') as FormArray:null;
}
getNestedMenuArray(index:number){
return this.nestedMenuArray?this.nestedMenuArray.at(index) as FormArray:null
}
Разместите здесь свой код.