I have a list of PrimeNG checkboxes. I have an array binded to it with ngModel
called selectedItems
. I also have initially checked items in that array. I have a situation where I add items to the selectedItems
not by checking the checkbox but by doing some other action (calling a function). For example by clicking a button situated somewhere else. My issue is I can see that when I console log the item is added to the selectedItems
array but the view has not been updated.
this is the code i used to test
selectedItems: any[] = [{ name: 'Accounting', key: 'A' }];
items: any[] = [
{ name: 'Accounting', key: 'A' },
{ name: 'Marketing', key: 'M' },
{ name: 'Production', key: 'P' },
{ name: 'Research', key: 'R' }
];
selectSomething(){
this.selectedItems.push({ name: 'Production', key: 'P' })
}
and the template
<div class="card flex justify-content-center">
<div class="flex flex-column gap-2">
<div *ngFor="let item of items" class="field-checkbox">
<p-checkbox name="group" [value]="item" [(ngModel)]="selectedItems" [inputId]="item.key" ></p-checkbox>
<label [for]="item.key">{{ item.name }}</label>
</div>
</div>
</div>
<button (click)="selectSomething()">Select Something</button>
When you push element to the array, change detection of p-checkbox
is not fired because reference to the array is the same and p-checkbox
uses OnPush
strategy
So you need to make a new array:
selectSomething() {
this.selectedItems = [...this.selectedItems, { name: 'Production', key: 'P' }]
}