【问题标题】:Angular 6 refresh Observable which fetches all entries from backend after deleteAngular 6 refresh Observable 删除后从后端获取所有条目
【发布时间】: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


【解决方案1】:

使用 BehaviorSubject

BehaviorSubject 具有存储 “当前值。这意味着你总是可以直接得到最后一个 从 BehaviorSubject 发出的值

当您删除时,将您的 BehaviorSubject 值设为 true,然后订阅 ngOnInit 中的值

update=new BehaviorSubject<boolean>(false);

ngOnInit() {
  this.fetchData();
  this.update.subscribe(update=>update === true ? this.fetchData() : '');
}

fetchData(){
      this.data = this.dataService.fetchData();
}

内部删除方法

deleteSetting(keyName: string) {
  const x = this.apiService.delete(keyName);
  x.subscribe(()=>this.update.next(true););
}

【讨论】:

  • 我想你的回答会让我找到一个好的解决方案,但现在对 BackEnd 的删除调用不会删除更多内容。但它调用 fetchData 并重新加载视图。为什么会发生这种情况?也许重要的是要知道在 dataService.fetchData() 中使用的 subject$ 已经是一个 BehaviourSubject
  • 你能分享你的删除方法吗?
  • 添加了上面服务中的方法
  • 工作得很好,只是为了澄清,你能解释一下 ngOnInit 的这行代码吗: this.update.subscribe(update => update === true ? this.fetchData() : '');
  • 基本上我使用的是 if else 的简写。初始设置更新行为主题值为false,此时我们不需要调用this.fetchData()
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 2019-08-29
  • 2019-03-18
  • 1970-01-01
  • 2012-11-23
  • 2014-05-15
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多