반응 형 입력 필드 비활성화


117

나는 이미 여기에서 다른 답변의 예를 따르려고 시도했지만 성공하지 못했습니다!

반응 형 (즉, 동적)을 만들었고 언제든지 일부 필드를 비활성화하고 싶습니다. 내 양식 코드 :

this.form = this._fb.group({
  name: ['', Validators.required],
  options: this._fb.array([])
});

const control = <FormArray>this.form.controls['options'];
control.push(this._fb.group({
  value: ['']
}));

내 HTML :

<div class='row' formArrayName="options">
  <div *ngFor="let opt of form.controls.options.controls; let i=index">
    <div [formGroupName]="i">
      <select formArrayName="value">
        <option></option>
        <option>{{ opt.controls.value }}</option>
      </select>
    </div>
  </div>
</div>

용이하게하기 위해 코드를 줄였습니다. 유형 선택 필드를 비활성화하고 싶습니다. 다음을 시도했습니다.

form = new FormGroup({
  first: new FormControl({value: '', disabled: true}, Validators.required),
});

작동하지 않는! 누구에게 제안이 있습니까?


first?`:) 라는 일부
formcontrol

오타 일뿐입니다. 선택을 비활성화하고 싶습니다. 도와주세요?
Renato Souza de Oliveira

플 런커를 재현 할 수 있습니까?
AJT82

전체 선택을 비활성화하려고합니까? 그리고 valueformArray가 아니라 formControlName입니다. 당신이 원하는 경우 valueformArray로 당신은 그것을 변경해야 할 것입니다. 현재는 formControlName입니다. 따라서 전체 선택 필드를 비활성화하려면 다음 <select formArrayName="value">으로 변경하십시오 .<select formControlName="value">
AJT82

답변:


222
name: [{value: '', disabled: true}, Validators.required],
name: [{value: '', disabled: this.isDisabled}, Validators.required],

또는

this.form.controls['name'].disable();

그런 값을 설정하면-> country : [{value : this.address.country, disabled : true}] 값이 채워지지 않습니다
Silvio Troia

동일한 기술을 사용하여 신뢰할 수있는 소스에서 자동으로 채워진 필드를 비활성화했습니다. 양식을 활성화 / 비활성화하는 스위치가 있으며 전체 양식을 활성화 한 후 일반적으로 if문을 사용하여 해당 필드를 비활성화 합니다. 양식이 제출되면 전체 양식이 다시 비활성화됩니다.
retr0

72

주의

조건에 대한 변수를 사용하여 양식을 만들고 나중에 변경하려고하면 작동 하지 않습니다 . 즉 , 양식이 변경되지 않습니다 .

예를 들면

this.isDisabled = true;

this.cardForm = this.fb.group({
    'number': [{value: null, disabled: this.isDisabled},
});

그리고 변수를 변경하면

this.isDisabled = false;

양식은 변경되지 않습니다. 당신은 사용해야합니다

this.cardForm.get ( 'number'). disable ();

BTW.

값을 변경하려면 patchValue 메서드를 사용해야합니다.

this.cardForm.patchValue({
    'number': '1703'
});

22

반응 형 양식이있는 DOM에서 disable을 사용하는 것은 나쁜 습관입니다. 당신은 당신이 옵션을 설정할 수 있습니다 FormControl당신이에서 init을 때,

username: new FormControl(
  {
    value: this.modelUser.Email,
    disabled: true
  },
  [
    Validators.required,
    Validators.minLength(3),
    Validators.maxLength(99)
  ]
);

재산 value이 필요하지 않습니다

또는 다음을 사용하여 양식을 제어 get('control_name')하고 설정할 수 있습니다.disable

this.userForm.get('username').disable();

반응 형 양식으로 DOM에서 disable을 사용하는 것이 왜 나쁜 습관입니까?
pumpkinthehead

2
각도에서 경고를 받게됩니다. It looks like you’re using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid ‘changed after checked’ errors. 따라서 컨트롤을 통해 직접 비활성화 / 활성화 상태를 변경하는 권장 방법입니다. 또한이 훌륭한 주제를 확인할 수 있습니다. netbasal.com/…
Volodymyr Khmil

10

필드 세트의 레이블로 입력 객체를 래핑하여 해결했습니다. 필드 세트에는 부울에 바인딩 된 disabled 속성이 있어야합니다.

 <fieldset [disabled]="isAnonymous">
    <label class="control-label" for="firstName">FirstName</label>
    <input class="form-control" id="firstName" type="text" formControlName="firstName" />
 </fieldset>

1
리 액티브 형식에서 컨트롤을 비활성화하는 방법을 알아내는 데 많은 시간을 낭비했습니다. LOL! 이것은 작동했다 .. 지시문이나 추가 코드가 필요하지 않습니다. 환호 🍻
Nexus

7

disablingFormControl는 prevents그 동안 형태로 존재하는 것으로 saving. readonly속성을 설정하기 만하면됩니다 .

그리고 다음과 같이 할 수 있습니다.

HTML :

<select formArrayName="value" [readonly] = "disableSelect">

TS :

this.disbaleSelect = true;

여기 에서 찾았 습니다


2
당신이 사용할 수있는 form.getRawValue()장애인 컨트롤의 값을 포함하는
Murhaf Sousli

6

사용하는 경우 disabled(정답에 제안처럼 폼 입력 요소 방법을 비활성화 입력에 그들도 비활성화되어 주목을 취할 것입니다에 대한 검증)!

(그리고 제출 버튼을 사용하는 경우 [disabled]="!form.valid"유효성 검사에서 필드가 제외됩니다)

여기에 이미지 설명 입력


1
처음에는 비활성화되었지만 동적으로 설정된 필드를 어떻게 확인할 수 있습니까?
NeptuneOyster

5

보다 일반적인 접근 방식이 있습니다.

// Variable/Flag declare
public formDisabled = false;

// Form init
this.form = new FormGroup({
  name: new FormControl({value: '', disabled: this.formDisabled}, 
    Validators.required),
 });

// Enable/disable form control
public toggleFormState() {
    this.formDisabled = !this.formDisabled;
    const state = this.formDisabled ? 'disable' : 'enable';

    Object.keys(this.form.controls).forEach((controlName) => {
        this.form.controls[controlName][state](); // disables/enables each form control based on 'this.formDisabled'
    });
}

3

first(formcontrol) 을 비활성화 하려면 아래 문을 사용할 수 있습니다.

this.form.first.disable();


3

이것은 나를 위해 일했습니다. this.form.get('first').disable({onlySelf: true});


3
this.form.enable()
this.form.disable()

또는 formcontrol 'first'

this.form.get('first').enable()
this.form.get('first').disable()

초기 설정에서 비활성화 또는 활성화를 설정할 수 있습니다.

 first: new FormControl({disabled: true}, Validators.required)


1

최고의 솔루션은 다음과 같습니다.

https://netbasal.com/disabling-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110

솔루션 개요 (링크가 끊어진 경우) :

(1) 지시문 작성

import { NgControl } from '@angular/forms';

@Directive({selector: '[disableControl]'})
export class DisableControlDirective {

  @Input() set disableControl( condition : boolean ) {
    const action = condition ? 'disable' : 'enable';
    this.ngControl.control[action]();
  }

  constructor( private ngControl : NgControl ) {}
}

(2) 그렇게 사용

<input [formControl]="formControl" [disableControl]="condition">

(3) 비활성화 된 입력은 제출시 form.value에 표시되지 않으므로 대신 다음을 사용해야 할 수 있습니다 (필요한 경우).

onSubmit(form) {
  const formValue = form.getRawValue() // gets form.value including disabled controls
  console.log(formValue)
}

나는 이런 식으로 시도했다. API 데이터를 가져온 후 대부분의 FormControl을 this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)표시하고 있으므로 formControl을 사용하여 값을 설정 / 패치 한 후 formControl을 표시합니다. 지시문에 전달되면 Cannot read property '
disable'of

0

나는 같은 문제가 있었지만 this.form.controls [ 'name']. disable () 호출은 내 뷰를 다시로드했기 때문에 수정하지 못했습니다 (router.navigate () 사용).

제 경우에는 다시로드하기 전에 양식을 재설정해야했습니다.

this.form = 정의되지 않음; this.router.navigate ([경로]);



0

모든 양식 컨트롤을 활성화 / 비활성화하는 함수를 선언 할 수 있습니다.

  toggleDisableFormControl(value: Boolean, exclude = []) {
    const state = value ? 'disable' : 'enable';
    Object.keys(this.profileForm.controls).forEach((controlName) => {
      if (!exclude.includes(controlName))
        this.profileForm.controls[controlName][state]();
    });
  }

이렇게 사용하세요

this.toggleDisableFormControl(true, ['email']);
// disbale all field but email

-2

필드 만들려면 비활성화활성화반응 형태의 각도 2+

1. 비활성화하려면

  • 추가 [attr.disabled] = "true"를 입력합니다.

<input class="form-control" name="Firstname" formControlName="firstname" [attr.disabled]="true">

사용하려면

export class InformationSectionComponent {
formname = this.formbuilder.group({
firstname: ['']
});
}

전체 양식 활성화

this.formname.enable();

특정 필드 만 활성화

this.formname.controls.firstname.enable();

비활성화와 동일하게 enable ()을 disable ()으로 바꿉니다.

이것은 잘 작동합니다. 쿼리에 대한 설명.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.