angular - 在模板中使用 Observable

标签 angular typescript angularfire2

我正尝试通过以下方式在我的模板中使用可观察对象:

<md-nav-list>
    <a md-list-item *ngIf="!isAuth() | async" [routerLink]="['login']" (click)="sidenav.toggle()">Login</a>
    <a md-list-item *ngIf="isAuth() | async" (click)="logout()" (click)="sidenav.toggle()">Logout</a>
</md-nav-list>

在我的模块中:

isAuth(): Observable<boolean> {
  return this.loginservice.getAuthenticated()
    .map(user => {
      if (user) {
        if (user.hasOwnProperty('uid')) {
          return true;
        } else {
          return false;
        }
      } else {
        return false;
      }
    })
}

所以我的问题:

如果我登录并且 observable 返回 true -> 酷我的菜单项出现

但是如果 observable 返回 false -> 我的菜单是空的 -> 怎么了?

最佳答案

您的表达式 *ngIf="!isAuth() | async" 将被解释为:

isAuth() -> returns observable
!isAuth() -> returns false because of !
!isAuth() | async -> actually trying to subscribe on false which should fail

只需使用 !(isAuth() | async) 即可。

您遇到的另一个问题是您在加载模板时两次调用服务器。这是您可能不想做的事情。

最后,这个

isAuth(): Observable<boolean> {
  return this.loginservice.getAuthenticated()
    .map(user => {
      if (user) {
        if (user.hasOwnProperty('uid')) {
          return true;
        } else {
          return false;
        }
      } else {
        return false;
      }
    })
}

可以写成

this.loginservice.getAuthenticated()
    .map(user => user && user.hasOwnProperty('uid'))

并且有 Angular 5+ 作为

this.loginservice.getAuthenticated().pipe(
  map(user => user && user.hasOwnProperty('uid'))
)

关于angular - 在模板中使用 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41168263/

相关文章:

angular - 在angular2中访问任意 child

angular - 在 Electron 和 angular2 的外部浏览器中打开 url

javascript - 我无法访问两个对象中的 id

javascript - 如何在 Typescript 和 React.js 中使用随机字段解析 JSON

angular - 现在我有最新的 angularfire2 版本。如何降级到以前的版本?

javascript - Angular2 typescript 错误?

arrays - typescript :对象数组的valueof字段

javascript - 测试未导出的 TypeScript 函数

javascript - 我如何在 AngularFire2 中获取当前用户的访问 token ?

angular - 如何将可观察值存储在变量或属性中