I've got a html like this:
<ng-template [ngSwitchCase]="'textbox'">
<input *ngIf="setting.type==='number'"
[step]="setting.step"
[formControlName]="formName"
[id]="formName"
[type]="setting.type"
[placeholder]="setting.placeholder"
[title]="setting.description"
(ngModelChange)="onChange($event)">
</ng-template>
and on controller I've got the function onChange:
onChange(newValue: string) {
if (newValue === undefined)
return;
this.form.get(this.formName).setValue(<any>parseFloat(newValue));
}
When I was debugging this call of onChange func then I noticed that is still calling and really don't know why. There I've got a intinite loop.
My angular packages:
"@angular/animations": "8.2.7",
"@angular/cli": "8.3.5",
"@angular/common": "8.2.7",
"@angular/compiler": "8.2.7",
"@angular/core": "8.2.7",
"@angular/forms": "8.2.7",
"@angular/platform-browser": "8.2.7",
"@angular/platform-browser-dynamic": "8.2.7",
"@angular/router": "8.2.7",
"@babel/polyfill": "7.6.0",
Have you got a ideas what might be wrong with my code?
ControlValueAccessor Approach
See this answer to a similar question. I know that question is not exactly the same, but it appears to be a solid approach as far as I can tell. Instead of using the
ngModelChange
event, that answer suggests wrapping the input component and implementing a customControlValueAccessor
- see the documentation.Here is a StackBlitz example of this approach. However, it seems to behave just like the
blur
event, so theControlValueAccessor
in this case would likely be overkill compared to the approach below.Blur Event Approach
Another option would be to use the
blur
event on your input. Instead of trying to update the value every time it changes, you will just update the value (parse to afloat
) when the user leaves the control. Something like:HTML
Component TypeScript
Example I created on StackBlitz for the
blur
method.