Deaktivieren Sie Eingabefelder in reaktiver Form


116

Ich habe bereits versucht, dem Beispiel anderer Antworten von hier aus zu folgen, und es ist mir nicht gelungen!

Ich habe ein reaktives Formular (dh ein dynamisches Formular) erstellt und möchte einige Felder jederzeit deaktivieren. Mein Formularcode:

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: ['']
}));

mein 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>

Ich habe den Code reduziert, um dies zu erleichtern. Ich möchte das Feld Typauswahl deaktivieren. Ich habe Folgendes versucht:

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

funktioniert nicht! Hat jemand einen Vorschlag?


Wie könnte die Auswahl deaktiviert werden, wenn Sie versuchen, eine Formsteuerung namens zu deaktivieren first? `:)
AJT82

Es war nur ein Tippfehler. Ich möchte select deaktivieren. Können Sie mir helfen?
Renato Souza de Oliveira

Könnten Sie einen Plunker reproduzieren?
AJT82

Versuchen Sie, die gesamte Auswahl zu deaktivieren? Und valueist kein formArray, sondern ein formControlName. Wenn Sie valueein formArray sein möchten, müssen Sie es ändern. Derzeit ist es ein formControlName. Wenn Sie also möchten, dass das gesamte Auswahlfeld deaktiviert wird, wechseln Sie einfach <select formArrayName="value">zu<select formControlName="value">
AJT82

Antworten:


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

oder

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

Wenn ich einen solchen Wert setze -> country: [{value: this.address.country, disabled: true}], wird der Wert nicht ausgefüllt
Silvio Troia

Ich habe dieselbe Technik verwendet, um Felder zu deaktivieren, die automatisch aus vertrauenswürdigen Quellen ausgefüllt wurden. Ich habe einen Schalter zum Aktivieren / Deaktivieren des Formulars, und nachdem ich das gesamte Formular aktiviert habe, deaktiviere ich diese Felder normalerweise mithilfe von ifAnweisungen. Nach dem Absenden des Formulars wird das gesamte Formular erneut deaktiviert.
retr0

71

Passt auf

Wenn Sie ein Formular mit einer Variablen für die Bedingung erstellen und später versuchen, es zu ändern, funktioniert es nicht, dh das Formular ändert sich nicht .

Beispielsweise

this.isDisabled = true;

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

und wenn Sie die Variable ändern

this.isDisabled = false;

Das Formular wird sich nicht ändern. Du solltest benutzen

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

Übrigens.

Sie sollten die patchValue-Methode verwenden, um den Wert zu ändern:

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

21

Es ist eine schlechte Praxis, die Deaktivierung in einem DOM mit reaktiven Formen zu verwenden. Sie können diese Option in Ihrem festlegen FormControl, wenn Sie das von initiieren

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

Eigentum valueist nicht notwendig

Oder Sie können Ihre Formularsteuerung mit erhalten get('control_name')und festlegendisable

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

Warum ist es eine schlechte Praxis, die Deaktivierung im DOM mit reaktiven Formularen zu verwenden?
Pumpkinthehead

2
Sie erhalten eine Warnung von eckig. 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. Also die empfohlene Möglichkeit, den Deaktivierungs- / Aktivierungsstatus direkt über Steuerelemente zu ändern. Sie können auch dieses großartige Thema überprüfen netbasal.com/…
Volodymyr Khmil

10

Ich habe es gelöst, indem ich mein Eingabeobjekt mit seiner Bezeichnung in eine Feldmenge eingeschlossen habe: In der Feldmenge sollte die Eigenschaft disabled an den Booleschen Wert gebunden sein

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

1
Ich habe viel Zeit damit verschwendet, herauszufinden, wie Steuerelemente in reaktiven Formen deaktiviert werden können. LOL! Dies funktionierte. Keine Anweisungen oder zusätzlicher Code erforderlich. Prost 🍻
Nexus

7

Das disablingFormControl preventssoll in einer Form vorhanden sein saving. Sie können einfach die readonlyEigenschaft festlegen .

Und Sie können es so erreichen:

HTML:

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

TS:

this.disbaleSelect = true;

Fand das hier


2
Sie können form.getRawValue()die Werte für deaktivierte Steuerelemente
einschließen

6

Wenn die Verwendung von disabledFormulareingabeelementen (wie in der richtigen Antwort zum Deaktivieren der Eingabe vorgeschlagen ) ebenfalls deaktiviert ist, beachten Sie dies!

(Und wenn Sie die Schaltfläche "Senden" verwenden [disabled]="!form.valid", wird Ihr Feld von der Validierung ausgeschlossen.)

Geben Sie hier die Bildbeschreibung ein


1
Wie können Sie nach Feldern suchen, die anfangs deaktiviert, aber dynamisch festgelegt sind?
NeptuneOyster

5

Ein allgemeinerer Ansatz wäre.

// 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

Wenn Sie deaktivieren möchten first(formcontrol), können Sie die folgende Anweisung verwenden.

this.form.first.disable();


3

Das hat bei mir funktioniert: this.form.get('first').disable({onlySelf: true});


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

Oder formcontrol 'first'

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

Sie können Deaktivieren oder Aktivieren beim ersten Einstellen festlegen.

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

2

Geben Sie hier die Bildbeschreibung ein

lastName: new FormControl({value: '', disabled: true}, Validators.compose([Validators.required])),

1

Die beste Lösung ist hier:

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

Lösungsüberblick (bei defekter Verbindung):

(1) Erstellen Sie eine Richtlinie

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) Verwenden Sie es so

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

(3) Da deaktivierte Eingaben beim Senden nicht in form.value angezeigt werden, müssen Sie möglicherweise stattdessen Folgendes verwenden (falls erforderlich):

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

Ich habe es so versucht. Ich zeige die meisten meiner FormControls nach dem Abrufen von API-Daten. Nach dem Festlegen / Patchen des Werts für mein formControl mit this.form.get('FIELD_NAME').patchValue(DYNAMIC_VALUE)zeige ich das formControl. Wenn es an die Direktive übergeben wird, wird
angezeigt

0

Ich hatte das gleiche Problem, aber das Aufrufen von this.form.controls ['name']. Disable () hat es nicht behoben, da ich meine Ansicht neu geladen habe (mithilfe von router.navigate ()).

In meinem Fall musste ich mein Formular vor dem erneuten Laden zurücksetzen:

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



0

Sie können eine Funktion zum Aktivieren / Deaktivieren des gesamten Formularsteuerelements deklarieren:

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

und benutze es so

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

-2

Um ein Feld zu machen deaktivieren und aktiviert von reaktiver Form Winkel 2+

1. Deaktivieren

  • Fügen Sie [attr.disabled] = "true" zur Eingabe hinzu.

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

Ermöglichen

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

Aktivieren Sie das gesamte Formular

this.formname.enable();

Aktivieren Sie nur ein bestimmtes Feld

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

Gleiches gilt für Deaktivieren. Ersetzen Sie enable () durch disable ().

Das funktioniert gut. Kommentar für Fragen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.