Как отключить динамическое управление в angular

Я пытаюсь создать динамические поля, используя этот код

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 элемент управления должен быть отключен, и если я выбираю раскрывающийся список из элемента управления выбором, тогда только он должен быть включен

любое решение Спасибо

Скрыть элемент управления — это поведение, отличное от отключения управления. Вам необходимо уточнить желаемое поведение, также было бы здорово привести пример, например, выбрать, какую опцию отображать/включать элемент управления.

Yong Shun 04.07.2024 11:15

@YongShun Извините, вы хотите по умолчанию отключить только поле ввода, и если я создаю, используя метод addFields, и если я выбираю раскрывающийся список, то оно должно быть включено

user3653474 04.07.2024 11:23
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предположим, 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 04.07.2024 11:44

@user3653474 user3653474 обновил мой ответ.

JSON Derulo 04.07.2024 11:52

очень, очень, очень старый, но: stackoverflow.com/questions/47937639/…

Eliseo 04.07.2024 13:23
Ответ принят как подходящий

Мы можем использовать событие (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);

Демо-версия Stackblitz

Спасибо за ответ, когда я объявляю formInputfieldsForm: FormArray<any> = new FormArray<any>([]);, выдает ошибку Type FormArray is not generic не могли бы вы проверить?

user3653474 04.07.2024 12:25

@user3653474 user3653474 попробуйте удалить <any>, это может решить вашу проблему.

Naren Murali 04.07.2024 12:26

возможно ли это также с использованием только группы форм, которую мы можем отключить, не превращая ее в массив из-за изменений кода

user3653474 04.07.2024 13:02

@user3653474 user3653474 рассмотрите массив форм, потому что у вас будет возможность получить статус и другие сведения обо всех формах, но вы также можете применить тот же подход к массиву групп форм.

Naren Murali 04.07.2024 13:20

не могли бы вы сообщить мне, есть ли у меня индекс, как мы можем отключить эти конкретные поля в группе форм, я пытался таким образом this.formInputfieldsForm.forEach((f) => { if (f.get("inputType").value=='dropdown') { f.get('inputValues').enable; } else { f.get('inputValues').enable; } });

user3653474 04.07.2024 13:24

@user3653474 user3653474 попробуйте изменить мой stackblitz своим кодом, поделитесь им со мной и объясните, что не работает, это будет самый быстрый способ решения

Naren Murali 04.07.2024 13:27

не могли бы вы проверить это stackblitz.com/edit/…, в методе dropdownChanged можем ли мы отключить определенные входные значения без использования массива форм

user3653474 04.07.2024 13:38

@user3653474 user3653474 это нравится? стекблиц

Naren Murali 04.07.2024 13:43

Да, это работает. Спасибо.

user3653474 04.07.2024 13:44

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