【发布时间】:2019-03-21 21:50:54
【问题描述】:
我有一个 Observable,它从我的后端获取所有数据。当我对某个项目执行删除操作时,我想刷新这个 observable。
我尝试了两种可行的解决方案,但它们似乎真的很难看。
一种是强制 angular 重新加载当前路由,另一种是如下代码所示,以给定的时间间隔重新订阅 observable
component.ts:
data: Observable<Setting[]>;
ngOnInit() {
this.data = interval(1000).pipe(
startWith(0),
mergeMap(res => this.dataService.fetchData())
);
}
我在模板中使用异步管道来订阅我的 observable。
dataService.fetchData() 看起来像这样:
fetchData() {
const fetch$: Observable <Setting[]> = this.apiService.getSettings().pipe(share());
fetch$.pipe(
map(allSettings => this.subject$.next(allSettings))
);
return fetch$;
}
component.html:
<table>
<tr *ngFor="let s of data | async">
<td>{{s.property}}</td>
<td>
<button (click)="s = s = s.Id; delete(s)">Delete</button>
</td>
</table>
由于我的上一个解决方案不断向我的后端发送 GET 请求,这会浪费网络流量,有人知道如何使用其他技术刷新我的 Observable 吗?在 delete() 之后调用 fetchData() 不会更新我的视图。即使我在浏览器中刷新视图(使用 F5),更改也会出现。
编辑:
对象服务:
deleteSetting(keyName: string) {
const x = this.apiService.delete(keyName);
x.subscribe();
}
api服务:
delete(keyName: string): Observable<any> {
let params = new HttpParams();
params = params.append('keyName', keyName);
return this.httpClient.delete<Setting>(this.API_URL + '/settings/delete', {params})
.pipe(
catchError(this.handleError('delete', []))
);
}
component.ts 中的 delete():
deleteSetting() {
this.settingsService.deleteSetting(this.keyNameToDelete);
this.update.next(true);
}
【问题讨论】:
-
您想在数据被删除后立即发出获取请求吗?或者您想在本地更新数据而无需访问网络?
-
通常删除请求会将更新后的数据发回给您。
-
我不认为你可以刷新 observable。使用 HttpClient 时,observable 在获取数据后完成。但是你可以在删除项目时直接运行“this.dataService.fetchData()”。您还可以创建一个在删除完成时触发的主题并订阅该主题以获取数据。
-
我想在数据被删除后发起get请求
-
@VinodBhavnani 所以如果我调用 delete(object),它将实例化一个新的 GET 请求以获取更改的上下文?
标签: angular typescript observable