Reputation: 4574
I already tried to follow the example of other answers from here and I did not succeed!
I created a reactive form (ie, dynamic) and I want to disable some fields at any given time. My form code:
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: ['']
}));
my 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>
I reduced the code to facilitate. I want to disable the field of type select. I tried to do the following:
form = new FormGroup({
first: new FormControl({value: '', disabled: true}, Validators.required),
});
not working! Does anyone have a suggestion?
Upvotes: 296
Views: 656044
Reputation: 109
this is how to disable a reactive form
// Function to disable all form controls
disableForm() {
Object.keys(this.form.controls).forEach(controlName => {
this.form.get(controlName)?.disable();
});
}
// Calling the function to disable the form controls
this.disableForm();
Upvotes: 0
Reputation: 813
You can also use attr.disabled for checkbox or radio in html without coding in .ts file, like this:
<input type="checkbox" id="hasDataACheck" formControlName="hasDataA" /> <label class="form-check-label" for="hasDataACheck"> has Data A </label> <input type="text" formControlName="controlA" [attr.disabled]=" form.get('hasDataA').value ? null : '' />
Upvotes: 1
Reputation: 1
You cannot disable the input control using disabled attribute in the reactive forms. The best solution for this is you can simply add a fieldset element and insert the input control in the fieldset element. After that you can easily disable or enable the fieldset element using typescript.
For ex.
index.html
<fieldset [disabled]="variable_name">
<input name="name" formcontrolname="name">
</fieldset
index.ts
variable_name:boolean;
if(condition):
{
variable_name=true;
}
else
{
variable_name=false;
}
This would easily help you to dynamically hide or show the input control
Upvotes: 0
Reputation: 2035
The disabling
FormControl prevents
it to be present in a form while saving
. You can just set it the readonly
property.
And you can achieve it this way :
HTML :
<select formArrayName="value" [readonly] = "disableSelect">
TypeScript :
this.disableSelect = true;
Details here
Upvotes: 30
Reputation: 1
Angular 14+
field = new FormControl<any>()
readonly formGroup = new FormGroup<any>({
field2: new FormControl<any>(),
});
Option 1
ngOnInit() {
# ...
this.field.setDisable();
this.field.setEnable();
this.formGroup.controls.field2.setEnable();
this.formGroup.controls.field2.setDisabled();
# ...
}
Option 2
private setFieldEnabled() {
this.field.setEnable()
}
private setFieldDisabled() {
this.field.setDisable()
}
private setField2Enabled() {
this.formGroup.controls.breakdown.setEnable();
}
private setField2Disabled() {
this.formGroup.controls.breakdown.setDisable();
}
setEnableOrDisableFields(truth: boolean): void {
if (truth) {
this.setFieldEnabled()
this.setField2Enabled();
return
}
this.setFieldDisabled()
this.setField2Disabled();
}
Upvotes: 0
Reputation: 363
I am just using
<input type="text" formControlName="firstName" [attr.disabled]="true || null" />
With this firstName
stays accessible in form.value
Important: You have to use || null
as the default value, so that angular can remove the attribute alltogether.
Upvotes: 4
Reputation: 15204
Pay attention
If you are creating a form using a variable for condition and trying to change it later it will not work, i.e. the form will not change.
For example
this.isDisabled = true;
this.cardForm = this.fb.group({
number: {value: null, disabled: this.isDisabled},
});
and if you change the variable
this.isDisabled = false;
the form will not change. You should use
this.cardForm.get('number').disable();
BTW.
You should use patchValue method for changing value:
this.cardForm.patchValue({
number: '1703'
});
Upvotes: 152
Reputation: 308
You can declare a function to enable/disable all of the form control:
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]();
});
}
and use it like this
// disbale all field but email
this.toggleDisableFormControl(true, ['email']);
Upvotes: 0
Reputation: 1
I was trying to get values from the localstorage and I wanted the email and password fields to be disabled. This worked for me:
email: new FormControl({value: localStorage.getItem("email"), disabled:true},[
Validators.required,
Validators.minLength(3),
]),
password: new FormControl({value: localStorage.getItem("password"), disabled:true},[
Validators.required,
Validators.minLength(3),
])
Upvotes: 0
Reputation: 1
you can do it easily by adding a css class and bind it to with angular.
.disable{
pointer-events: none;
}
<div [ngClass]="{'disable': //condition goes here">
<input type="text" formControlName="test">
</div>
Upvotes: -4
Reputation: 1666
If you have a form group, just display the form group. Then all formcontrols are disabled.
formGroup = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
});
this.formGroup.disable();
Upvotes: 1
Reputation: 117
Providing disabled
property as true inside FormControl surely disables the input field.
this.form=this.fb.group({
FirstName:[{value:'first name', disabled:true}],
LastValue:['last name,[Validators.required]]
})
The above example will disable the FirstName
input field.
But real problem arises when you try to access disabled field value through form like this
console.log(this.form.value.FirstName);
and it shows as undefined
instead of printing field's actual value. So, to access disabled field's value, one must use getRawValue()
method provided by Reactive Forms
. i.e. console.log(this.form.getRawValue().FirstName);
would print the actual value of form field and not undefined.
Upvotes: 9
Reputation: 157
while making ReactiveForm:[define properety disbaled in FormControl]
'fieldName'= new FormControl({value:null,disabled:true})
html:
<input type="text" aria-label="billNo" class="form-control" formControlName='fieldName'>
Upvotes: -1
Reputation: 828
this.form.enable()
this.form.disable()
Or formcontrol 'first'
this.form.get('first').enable()
this.form.get('first').disable()
You can set disable or enable on initial set.
first: new FormControl({disabled: true}, Validators.required)
Upvotes: 30
Reputation: 2933
lastName: new FormControl({value: '', disabled: true}, Validators.compose([Validators.required])),
Upvotes: 2
Reputation: 768
I had the same problem, but calling this.form.controls['name'].disable() did not fixed it because I was reloading my view (using router.navigate()).
In my case I had to reset my form before reloading:
this.form = undefined; this.router.navigate([path]);
Upvotes: 0
Reputation: 683
<input class="form-control" name="Firstname" formControlName="firstname" [attr.disabled]="true">
export class InformationSectionComponent {
formname = this.formbuilder.group({
firstname: ['']
});
}
Enable whole form
this.formname.enable();
Enable particular field alone
this.formname.controls.firstname.enable();
same for disable, replace enable() with disable().
This Works fine. Comment for queries.
Upvotes: -1
Reputation: 56936
The best solution is here:
Outline of solution (in case of broken link):
(1) Create a directive
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) Use it like so
<input [formControl]="formControl" [disableControl]="condition">
(3) Since disabled inputs do not show in form.value on submit you may need to use the following instead (if required):
onSubmit(form) {
const formValue = form.getRawValue() // gets form.value including disabled controls
console.log(formValue)
}
Upvotes: 4
Reputation: 1244
It is bad practice to use disable in a DOM with reactive forms.
You can set this option in your FormControl
, when you init the from
username: new FormControl(
{
value: this.modelUser.Email,
disabled: true
},
[
Validators.required,
Validators.minLength(3),
Validators.maxLength(99)
]
);
Property value
is not necessary
Or you can get your form control with get('control_name')
and set disable
this.userForm.get('username').disable();
Upvotes: 44
Reputation: 6509
If to use disabled
form input elements (like suggested in correct answer
how to disable input) validation for them will be also disabled, take attention for that!
(And if you are using on submit button like [disabled]="!form.valid"
it will exclude your field from validation)
Upvotes: 8
Reputation: 5644
name: [{value: '', disabled: true}, Validators.required],
name: [{value: '', disabled: this.isDisabled}, Validators.required],
or
this.form.controls['name'].disable();
Upvotes: 552
Reputation: 41
This worked for me:
this.form.get('first').disable({onlySelf: true});
Upvotes: 4
Reputation: 820
I solved it by wrapping my input object with its label in a field set: The fieldset should have the disabled property binded to the boolean
<fieldset [disabled]="isAnonymous">
<label class="control-label" for="firstName">FirstName</label>
<input class="form-control" id="firstName" type="text" formControlName="firstName" />
</fieldset>
Upvotes: 69
Reputation: 2042
A more general approach would be.
// 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'
});
}
Upvotes: 12
Reputation: 4374
If you want to disable first
(formcontrol) then you can use below statement.
this.form.first.disable();
Upvotes: 9