В вашем случае вам не нужно определять BehaviourSubject
, потому что вы не поддерживаете состояние приложения. Таким образом, вы можете просто использовать следующее:
В вашем сервисном компоненте пишите только сервис. Поскольку сервис - это одноэлементный объект, который инициализируется только один раз.
@Injectable()
export class SomeDataService {
//Made this as observable, But when you use httpClient, No need to use Observable.of(), you can directly return like this.http.get<any[]>('/api/items')
myData=Observable.of([{id:1,name:'cat'},{id:2,name:'dog'},{id:3,name:'rabbit'}])
constructor() {
}
loadItems() {
// in your case, return this.http.get<any[]>('/api/items')
return this.myData;
}
}
В AppComponent
export class AppComponent implements OnInit {
counter=4;
mydata=[]; //No point to make this as Observable array
constructor(private _service: SomeDataService) { }
public ngOnInit(): void {
this._service.loadItems().subscribe(res=>{
this.mydata=res;
})
}
addData(){
let increment=this.counter++
let data={id:increment,name:increment+"data"}
this.mydata.push(data)
}
removeData(item){
let index=this.mydata.indexOf(item)
this.mydata = this.mydata.filter((val,i) => i!=index);
}
}
В html,
<button (click)="addData()">Add data</button>
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Action</th>
</tr>
<tr *ngFor="let data of mydata;let i=index;">
<td>{{data.id}}</td>
<td>{{data.name}}</td>
<td><button (click)="removeData(data)">Remove data</button></td>
</tr>
</table>
Нажмите здесь для демонстрации Stackblitz Надеюсь, это может помочь вам