代码之家  ›  专栏  ›  技术社区  ›  Armeen Moon

如何从AngularFirestore获取可观测的返回并解决我的路由器保护

  •  0
  • Armeen Moon  · 技术社区  · 6 年前

    问:我如何调用firestore并用firestore返回的有效负载解决我的路由器保护?

    问题:我的route resolve guard没有得到解决,即使来自firestore的值正在返回并被定义。

    import {
      ActivatedRouteSnapshot,
      Resolve,
      RouterStateSnapshot,
    } from '@angular/router';
    import { AngularFirestore } from 'angularfire2/firestore';
    import { Observable } from 'rxjs';
    import { Injectable } from '@angular/core';
    import { map } from 'rxjs/operators';
    
    
    @Injectable()
    export class RouteResolve implements Resolve<any> {
      constructor(private db: AngularFirestore) {
      }
    
      resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
        return this.db
                   .collection('routes')
                   .doc('work')
                   .valueChanges()
                   .pipe(
                     map((item) => {
                       if (item) {
                         console.log('items', item) // this logs just fine.
                         return item; // this doesen't resolve the router guard.
                       }
                     }));
      }
    }
    

    一切都在运转,但已完成的决心。如果我返回真值,解决方案会按预期工作。

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
      return true; // this will resolve just fine
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Lahiru Chandima    6 年前

    添加 pipe(first()) 给你的 valueChanges() 可观察的。角度路由器一直等到可观测值完成,这样做可以确保可观测值在第一次值改变后完成。

    return this.db
               .collection('routes')
               .doc('work')
               .valueChanges()
               .pipe(first())
               .pipe(
                 map((item) => {
                   if (item) {
                     console.log('items', item) // this logs just fine.
                     return item; // this doesen't resolve the router guard.
                   }
                 }));