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?

Renato Souza de Oliveira
quelle
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();
Joche Wis
quelle
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'
});
Dmitry Grinko
quelle
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();
Volodymyr Khmil
quelle
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>
Fernando M.
quelle
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

Alex Po
quelle
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

Alex Efimov
quelle
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'
    });
}
Herbi Shtini
quelle
3

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

this.form.first.disable();

Gampesh
quelle
3

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

Foram Jhaveri
quelle
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)
Pu ChengLie
quelle
2

Geben Sie hier die Bildbeschreibung ein

lastName: new FormControl({value: '', disabled: true}, Validators.compose([Validators.required])),
Abdullah Pariyani
quelle
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)
}
danday74
quelle
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]);

Tai Truong
quelle
0
setTimeout(() => { emailGroup.disable(); });
Judson Terrell
quelle
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
Duong Le
quelle
-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.

Srinivasan N.
quelle