I have an Angular application of version 6, and when I click on the project to edit the system loads the edit screen with all values, that application is not with database and there is no backend connected to it , all values are static.
What I need is to disable some form properties so that the user can edit some fields and other fields is not available for the user to change as it is my case to not allow the user to change the description field.
My attempt was to put the line of code below;
recipeIngredients.get('recipeForm').disable();
But I was not successful, what he has done is not to display the information on screen. Would anyone have any suggestions for solving my problem please?
This is a reactive form.
This is the complete component;
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { FormGroup, FormControl, FormArray, Validators } from '@angular/forms';
import { RecipeService } from '../recipe.service';
@Component({
selector: 'app-recipe-edit',
templateUrl: './recipe-edit.component.html',
styleUrls: ['./recipe-edit.component.css']
})
export class RecipeEditComponent implements OnInit {
id: number;
editMode = false;
recipeForm: FormGroup;
constructor(private route: ActivatedRoute,
private recipeService: RecipeService,
private router: Router) {
}
ngOnInit() {
this.route.params
.subscribe(
(params: Params) => {
this.id = +params['id'];
this.editMode = params['id'] != null;
this.initForm();
}
);
}
onSubmit() {
// const newRecipe = new Recipe(
// this.recipeForm.value['name'],
// this.recipeForm.value['description'],
// this.recipeForm.value['imagePath'],
// this.recipeForm.value['ingredients']);
if (this.editMode) {
this.recipeService.updateRecipe(this.id, this.recipeForm.value);
} else {
this.recipeService.addRecipe(this.recipeForm.value);
}
this.onCancel();
}
onAddIngredient() {
(<FormArray>this.recipeForm.get('ingredients')).push(
new FormGroup({
'name': new FormControl(null, Validators.required),
'amount': new FormControl(null, [
Validators.required,
Validators.pattern(/^[1-9]+[0-9]*$/)
])
})
);
}
onDeleteIngredient(index: number) {
(<FormArray>this.recipeForm.get('ingredients')).removeAt(index);
}
onCancel() {
this.router.navigate(['../'], {relativeTo: this.route});
}
private initForm() {
let recipeName = '';
let recipeImagePath = '';
let recipeDescription = '';
let recipeIngredients = new FormArray([]);
if (this.editMode) {
const recipe = this.recipeService.getRecipe(this.id);
recipeName = recipe.name;
recipeImagePath = recipe.imagePath;
recipeDescription = recipe.description;
recipeIngredients.get('recipeForm').disable();
if (recipe['ingredients']) {
for (let ingredient of recipe.ingredients) {
recipeIngredients.push(
new FormGroup({
'name': new FormControl(ingredient.name, Validators.required),
'amount': new FormControl(ingredient.amount, [
Validators.required,
Validators.pattern(/^[1-9]+[0-9]*$/)
])
})
);
}
}
}
this.recipeForm = new FormGroup({
'name': new FormControl(recipeName, Validators.required),
'imagePath': new FormControl(recipeImagePath, Validators.required),
'description': new FormControl(recipeDescription, Validators.required),
'ingredients': recipeIngredients
});
}
}
For those who want access to the complete project, it's in my repository;