javascript - 如果 observable 使用异步管道是错误的,则 Angular 显示模板

标签 javascript angular rxjs

我有一个 API 调用,它可能会返回一些数据,或者如果不存在数据,可能会返回一些虚假的东西。有数据我要tap退出流并做一些副作用,但如果是假的,我希望没有副作用发生但仍显示我的模板代码。
我正在使用异步管道在模板中获取该数据,但如果数据是错误的,它将不会显示。
我已经看到了包装 ngIf 的技术有一个对象,所以它的评估结果是真实的,但它似乎不是我的代码的正确解决方案。
我的模板:

<form *ngIf="loadedData$ | async">
  ...
</form>
我的课:
loadedData$: Observable<boolean>;

ngOnInit(): void {
  this.loadedData$ = this.getCurrentBranding().pipe(
    tap(branding => {
      if (branding) {
        // Do side effects
      }
    }),
    // current hack to make the template show
    map(() => true)
  );
}

private getCurrentBranding(): Observable<Branding> {
  // API call, may return an object, or null
}

最佳答案

我已经养成了为我的组件设置一个 observable 的习惯,它可以合并多个流,将它们组合成一个状态。通常这涉及到 扫一扫运算符,但在这种情况下没有必要(尽管也许您也想合并这些副作用)。
在下面的代码获取当前品牌 将在组件中的异步管道订阅它时执行。为了防止多次执行,您可以拥有一个使用 Angular 的 的根元素。如表达式将发射转换为模板变量。或者,您可以使用 分享回放 .
开始于 运算符用于提供初始值,因此将始终显示根元素。该表单最初将被隐藏,直到从 api 返回结果。数据将来自相同的可观察对象,并从根元素处创建的模板变量访问。

this.state$ = this.getCurrentBranding().pipe(
  tap(branding => { /* Do side effects */ ),
  map(data => ({ data, isLoaded: true}),
  startWith(({ data: [], isLoaded: false})
);
<ng-container *ngIf="(state$ | async) as state">
  <form *ngIf="state.isLoaded">
    <!-- ... -->
  </form>
  <ol *ngFor="let o of state.data">
    <!-- ... -->
  </ol>
</ng-container>

关于javascript - 如果 observable 使用异步管道是错误的,则 Angular 显示模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70367684/

相关文章:

angular - 未找到模块 : Error: Package path ./index 未从包 node_modules/rxjs 中导出(请参阅/node_modules/rxjs/package.json 中的导出字段)

javascript - 如何将 React 状态绑定(bind)到 RxJS 可观察流?

javascript - 如何使用 jquery 获取一组选定元素中元素的顺序?

javascript - 切换字符串等效的 bool 值

javascript - 测试执行期间Vue警告

angular - 添加到 NgModule.schemas 的 CUSTOM_ELEMENTS_SCHEMA 仍然显示错误

javascript - 不显示此警报 ---> 警报 ("I am inside change");

angular - 无法从 nativescript worker 访问 Angular 服务

angular - 避免在循环中使用嵌套可观察订阅的正确方法是什么?

javascript - 如何在php中屏蔽javascript字符串