I have complex and probably rookie bug in logic of my application, so I'll try to give comprehensive amount of information.
I have registration form binded to my data model. Phone number fields can be added by user during registration and saved as array.
My model:
export class RegistrationFormModel {
//
//
Phones: Array<{Phone: string;}>;
//
//
}
And representation of this part of form
<ion-item *ngFor="let Phone of regModel.Phones; let i = index">
<ion-label floating>Phone number*</ion-label>
<ion-input type="tel" required [(ngModel)]="regModel.Phones[i].Phone" name="Phone" #Phone="ngModel"
pattern="\d{10}"></ion-input>
<ion-icon *ngIf="i==0" name="ios-add-circle-outline" item-right no-padding
(click)="addPhone()"></ion-icon>
<ion-icon *ngIf="i!=0" name="ios-remove-circle-outline" item-right no-padding
(click)="removePhone(i)"></ion-icon>
</ion-item>
My methods for adding and removing phones. I added logs and incremental index for debug purposes:
debugIndex = 0;
\\
\\
addPhone() {
console.log('phones before add: ' + JSON.stringify(this.regModel.Phones));
this.regModel.Phones.splice((this.regModel.Phones.length), 0, {Phone: '' + this.debugIndex++});
console.log('phones after add: ' + JSON.stringify(this.regModel.Phones));
}
removePhone(i: number) {
console.log('phones before delete: ' + JSON.stringify(this.regModel.Phones));
this.regModel.Phones.splice(i, 1);
console.log('phones after delete: ' + JSON.stringify(this.regModel.Phones));
}
And from this part strange things happen. According to logs data writes in my model properly but in UI last element replaces everything in input fields. But after removing one of the phones displayed phones for this moment seems like represent last state of UI.
My logs captured during recording:
"phones before add: [{"Phone":"123456789"}]",
"phones after add: [{"Phone":"123456789"},{"Phone":"0"}]",
"phones before add: [{"Phone":"123456789"},{"Phone":"4567890"}]",
"phones after add: [{"Phone":"123456789"},{"Phone":"4567890"},{"Phone":"1"}]",
"phones before delete: [{"Phone":"123456789"},{"Phone":"4567890"},{"Phone":"1"}]",
"phones after delete: [{"Phone":"123456789"},{"Phone":"4567890"}]",
"phones before add: [{"Phone":"123456789"},{"Phone":"4567890"}]",
"phones after add: [{"Phone":"123456789"},{"Phone":"4567890"},{"Phone":"2"}]",
"phones before add: [{"Phone":"123456"},{"Phone":"4567890"},{"Phone":"2"}]",
"phones after add: [{"Phone":"123456"},{"Phone":"4567890"},{"Phone":"2"},{"Phone":"3"}]",
"phones before add: [{"Phone":"123456"},{"Phone":"456789"},{"Phone":"2"},{"Phone":"3"}]",
"phones after add: [{"Phone":"123456"},{"Phone":"456789"},{"Phone":"2"},{"Phone":"3"},{"Phone":"4"}]",
"phones before delete: [{"Phone":"123456"},{"Phone":"456789"},{"Phone":"2"},{"Phone":"3"},{"Phone":"4"}]"
"phones after delete: [{"Phone":"123456"},{"Phone":"456789"},{"Phone":"2"},{"Phone":"4"}]",
"phones before add: [{"Phone":"123456"},{"Phone":"456789"},{"Phone":"47890"},{"Phone":"4"}]",
"phones after add: [{"Phone":"123456"},{"Phone":"456789"},{"Phone":"47890"},{"Phone":"4"},{"Phone":"5"}]"
Any help appreciated and thanks in advance.
Adding
[ngModelOptions]="{standalone: true}"
to your input should fix the problem:For every input with
NgModel
directive,FormControl
will be created and it will be added toFormGroup
, but when you addstandalone: true
, the fields won't be added to theFormGroup
and this problem should be fixed. You should also removename
attribute from your input because only one of those is needed when using template driven forms. (name
orstandalone: true
)