反応型の入力フィールドを無効にする


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か? `:)
AJT82

それはタイプミスでした。選択を無効にしたい。手伝って頂けますか?
Renato Souza de Oliveira

プランカーを再現できますか?
AJT82 2017年

選択全体を無効にしようとしていますか?そしてvalue、それはformControlNameだ、formArrayではありません。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();

そのような値を設定した場合->国:[{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();

ところで。

値を変更するには、patchValueメソッドを使用する必要があります。

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

22

反応型フォームを持つDOMでdisableを使用することは悪い習慣です。FormControlfromを初期化するときに、このオプションをで設定できます。

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!これは機能しました..ディレクティブや追加のコードは必要ありません。歓声🍻
ネクサス

7

disablingFormControlは、preventsそれはしばらくの形で存在することにしますsavingreadonlyプロパティに設定するだけです。

そして、あなたはこの方法でそれを達成することができます:

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.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に値を設定またはパッチした後、formControlを表示します。ディレクティブに渡されると、未定義のプロパティ 'disable'を読み取れません
ImFarhad

0

同じ問題がありましたが、(router.navigate()を使用して)ビューをリロードしていたため、this.form.controls ['name']。disable()を呼び出しても修正されませんでした。

私の場合、リロードする前にフォームをリセットする必要がありました:

this.form = undefined; this.router.navigate([path]);



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();

disableの場合も同じです。enable()をdisable()に置き換えます。

これは問題なく動作します。クエリのコメント。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.