I have a Form In Angular-9 Application, contains few TextBoxes and My FormGroup object looks as below:
ngOnInit(): void {
this.initForm();
this.conditionalValidation();
}
initForm() {
this.formCreateNewPlan = this.fb.group({
channel: new FormControl('', { validators: [Validators.required], updateOn: 'blur' }),
template: new FormControl('', { validators: [Validators.required], updateOn: 'blur', }),
name: new FormControl('', {
validators: [
Validators.required, Validators.minLength(2), Validators.pattern(RegexPatterns.AlphaNumeric),], updateOn: 'blur'
}),
description: new FormControl('', {
validators: [Validators.pattern(RegexPatterns.AlphaNumeric)], updateOn: 'blur'
}),
planBasis: new FormControl('', { validators: [Validators.required], updateOn: 'blur' }),
startDate: new FormControl('', { validators: [Validators.required], updateOn: 'blur' }),
endDate: new FormControl('', { validators: [Validators.required], updateOn: 'blur' }),
circulation: [null],
percentResponse: [null],
orders: [null],
units: [null],
unitsPerOrder: [null],
revenuePerOrder: [null],
revenue: [null],
unusualDemandRevenue: [null],
});
}
Also, I'm doing Conditional Validation as shown below:
conditionalValidation() {
const circulation = this.formCreateNewPlan.get('circulation');
const percentResponse = this.formCreateNewPlan.get('percentResponse');
const orders = this.formCreateNewPlan.get('orders');
const units = this.formCreateNewPlan.get('units');
const unitsPerOrder = this.formCreateNewPlan.get('unitsPerOrder');
const revenuePerOrder = this.formCreateNewPlan.get('revenuePerOrder');
const revenue = this.formCreateNewPlan.get('revenue');
const unusualDemandRevenue = this.formCreateNewPlan.get('unusualDemandRevenue');
this.formCreateNewPlan.get('channel').valueChanges.subscribe(c => {
if (c == "46") {
circulation.setValidators([Validators.required, Validators.pattern(RegexPatterns.Numeric)]);
percentResponse.setValidators([Validators.required, Validators.pattern(RegexPatterns.Numeric)]);
} else {
circulation.clearValidators();
percentResponse.clearValidators();
}
if (c == "64") {
orders.setValidators([Validators.required, Validators.pattern(RegexPatterns.Numeric)]);
units.setValidators([Validators.required, Validators.pattern(RegexPatterns.Numeric)]);
unitsPerOrder.setValidators([Validators.required, Validators.pattern(RegexPatterns.Decimal)]);
revenuePerOrder.setValidators([Validators.required, Validators.pattern(RegexPatterns.Decimal)]);
revenue.setValidators([Validators.required, Validators.pattern(RegexPatterns.Decimal)]);
unusualDemandRevenue.setValidators([Validators.required, Validators.pattern(RegexPatterns.Decimal)]);
} else {
orders.clearValidators();
units.clearValidators();
unitsPerOrder.clearValidators();
revenuePerOrder.clearValidators();
revenue.clearValidators();
unusualDemandRevenue.clearValidators();
}
circulation.updateValueAndValidity();
percentResponse.updateValueAndValidity();
orders.updateValueAndValidity();
units.updateValueAndValidity();
unitsPerOrder.updateValueAndValidity();
revenuePerOrder.updateValueAndValidity();
revenue.updateValueAndValidity();
unusualDemandRevenue.updateValueAndValidity();
});
}
Here, I want to do some calculation based on TextBox values (on change):
- Orders – This is a calculated field when catalog is the channel (Circulation x Percent Response).
- Revenue - This is a calculated field (Orders x Revenue / Order).
- Units / Order – This is a calculated field (Units / Orders)
How to do this in Reactive Form? Please help me in this.
