Я пытаюсь создать динамические поля, используя этот код
formInputfieldsForm: FormGroup[];
defaultFields: any = [
{ inputType: 'textbox', inputValues: '' },
{ inputType: 'textbox', inputValues: '' },
]
createForm(a?: any, b?: any, c?: any): FormGroup {
return this.formService.group({
"inputType": [b, Validators.required],
"inputValues": [c, Validators.required],
})
}
addFields(){
this.defaultFields.forEach((ele, i) => {
this.formInputfieldsForm.push(this.createForm(ele?.inputType, ele?.inputValues));
});
}
createFieldsForm(): FormGroup {
return this.formService.group({
"inputType": [null, Validators.required],
"inputValues": [null, Validators.required],
})
}
addFields(){
this.formInputfieldsForm.push(this.createFieldsForm());
}
каждый раз, когда addFields
вызывается, создаются новые динамические поля
во внешнем интерфейсе я использую цикл для рендеринга таких элементов
<div *ngFor = "let expForm of formInputfieldsForm; let i = index;" [formGroup] = "expForm">
<select class = "hand_symbol" formControlName = "inputType" placeholder = "Select Input Type">
<option value = "">Select</option>
<option value = "textbox">Textbox</option>
<option value = "dropdown">Drop Down</option>
<option value = "textarea">Textarea</option>
</select>
<input class = "form-control" formControlName = "inputValues" type = "text" placeholder = "Enter Values" type = "text">
</div>
<span title = "Add" (click) = "addFields()">add</span>
теперь он отображается, мне нужно по умолчанию inputValues
элемент управления должен быть отключен, и если я выбираю раскрывающийся список из элемента управления выбором, тогда только он должен быть включен
любое решение Спасибо
@YongShun Извините, вы хотите по умолчанию отключить только поле ввода, и если я создаю, используя метод addFields
, и если я выбираю раскрывающийся список, то оно должно быть включено
Предположим, formService
является экземпляром FormBuilder. При создании формы первым элементом массива является либо исходное значение, либо объект со свойствами value
и disabled
. Чтобы включить элемент управления после изменения значения inputType, вы можете подписаться на изменения значения и вызвать функцию enable()
экземпляра элемента управления. Обновленный код:
createFieldsForm(): FormGroup {
const formGroup = this.formService.group({
"inputType": [null, Validators.required],
"inputValues": [{ value: null, disabled: true }, Validators.required],
});
formGroup.inputType.valueChanges
.pipe(take(1))
.subscribe(() => formGroup.controls.inputValues.enable());
return formGroup;
}
Спасибо, если я изменю значения раскрывающегося списка и выберу раскрывающийся список, тогда я хочу включить его. Не могли бы вы сообщить мне, что я разместил код компонента html?
@user3653474 user3653474 обновил мой ответ.
очень, очень, очень старый, но: stackoverflow.com/questions/47937639/…
Мы можем использовать событие (change)
, чтобы получить группу форм и проверить, следует ли ее включить или отключить.
dropdownChanged(index: number) {
const formGroup = this.formInputfieldsForm.at(index);
const values = formGroup.value;
formGroup.get('inputValues')!.setValue(null);
if (values.inputType === 'dropdown') {
formGroup.get('inputValues')!.enable();
} else {
formGroup.get('inputValues')!.disable();
}
}
Мы можем использовать проверку троичного условия, если значение по умолчанию — раскрывающийся список и следует ли его включить/отключить.
createForm(b?: any, c?: any): FormGroup {
return this.fb.group({
inputType: [b, Validators.required],
inputValues: [
b === 'dropdown' ? c : { value: c, disabled: true },
Validators.required,
],
});
}
import { CommonModule } from '@angular/common';
import { Component, inject } from '@angular/core';
import {
FormArray,
FormBuilder,
FormGroup,
ReactiveFormsModule,
Validators,
} from '@angular/forms';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
@Component({
selector: 'app-root',
imports: [CommonModule, ReactiveFormsModule],
standalone: true,
template: `
<div *ngFor = "let expForm of getFields(); let i = index;" [formGroup] = "expForm">
<select class = "hand_symbol" formControlName = "inputType" placeholder = "Select Input Type" (change) = "dropdownChanged(i)">
<option value = "">Select</option>
<option value = "textbox">Textbox</option>
<option value = "dropdown">Drop Down</option>
<option value = "textarea">Textarea</option>
</select>
<input class = "form-control" formControlName = "inputValues" type = "text" placeholder = "Enter Values" type = "text">
</div>
<span title = "Add" (click) = "addFields()">add</span>
`,
})
export class App {
formInputfieldsForm: FormArray<any> = new FormArray<any>([]);
fb = inject(FormBuilder);
defaultFields: any = [
{ inputType: 'textbox', inputValues: '' },
{ inputType: 'textbox', inputValues: '' },
];
getFields() {
return this.formInputfieldsForm.controls as FormGroup[];
}
dropdownChanged(index: number) {
const formGroup = this.formInputfieldsForm.at(index);
const values = formGroup.value;
formGroup.get('inputValues')!.setValue(null);
if (values.inputType === 'dropdown') {
formGroup.get('inputValues')!.enable();
} else {
formGroup.get('inputValues')!.disable();
}
}
createForm(b?: any, c?: any): FormGroup {
return this.fb.group({
inputType: [b, Validators.required],
inputValues: [
b === 'dropdown' ? c : { value: c, disabled: true },
Validators.required,
],
});
}
ngOnInit() {
this.addFieldsOnLoad();
}
addFieldsOnLoad() {
this.defaultFields.forEach((ele: any, i: any) => {
this.formInputfieldsForm.push(
this.createForm(ele?.inputType, ele?.inputValues)
);
});
}
createFieldsForm(): FormGroup {
return this.fb.group({
inputType: [null, Validators.required],
inputValues: [null, Validators.required],
});
}
addFields() {
this.formInputfieldsForm.push(this.createForm('', ''));
}
}
bootstrapApplication(App);
Спасибо за ответ, когда я объявляю formInputfieldsForm: FormArray<any> = new FormArray<any>([]);
, выдает ошибку Type FormArray is not generic
не могли бы вы проверить?
@user3653474 user3653474 попробуйте удалить <any>, это может решить вашу проблему.
возможно ли это также с использованием только группы форм, которую мы можем отключить, не превращая ее в массив из-за изменений кода
@user3653474 user3653474 рассмотрите массив форм, потому что у вас будет возможность получить статус и другие сведения обо всех формах, но вы также можете применить тот же подход к массиву групп форм.
не могли бы вы сообщить мне, есть ли у меня индекс, как мы можем отключить эти конкретные поля в группе форм, я пытался таким образом this.formInputfieldsForm.forEach((f) => { if (f.get("inputType").value=='dropdown') { f.get('inputValues').enable; } else { f.get('inputValues').enable; } });
@user3653474 user3653474 попробуйте изменить мой stackblitz своим кодом, поделитесь им со мной и объясните, что не работает, это будет самый быстрый способ решения
не могли бы вы проверить это stackblitz.com/edit/…, в методе dropdownChanged
можем ли мы отключить определенные входные значения без использования массива форм
@user3653474 user3653474 это нравится? стекблиц
Да, это работает. Спасибо.
Скрыть элемент управления — это поведение, отличное от отключения управления. Вам необходимо уточнить желаемое поведение, также было бы здорово привести пример, например, выбрать, какую опцию отображать/включать элемент управления.