Вы не делаете ничего плохого. Если вы отобразите {{item.b}}
в ngFor
, вы увидите, что значение корректно меняется между true
и false
. Как уже упоминалось в другом ответе, это из-за ссылок и обнаружения изменений. Вы также можете просто сохранить наблюдаемые данные в свойстве класса, используя ngOnInit
и subscribe
:
import { Component } from "@angular/core";
import { of } from "rxjs";
import { map } from "rxjs/operators";
@Component({
selector: "my-app",
template: `
{{ items | json }}
<form #myForm="ngForm">
<div *ngFor="let item of items">
<input [name]="item.i.name" type="checkbox" [(ngModel)]="item.b" />
</div>
</form>
`
})
export class AppComponent {
items: any[] = [];
ngOnInit() {
this.getData().subscribe(data => (this.items = data));
}
private getData() {
return of([
{
name: "1"
},
{
name: "2"
},
{
name: "3"
}
]).pipe(
map(i => {
return i.map(i => {
return {
i: i,
b: false
};
});
})
);
}
}
Вот пример в действии. Не забудьте при необходимости очистить все наблюдаемые, чтобы избежать утечек памяти.