遇到take()属性的问题

时间:2018-02-19 22:39:25

标签: angular typescript firebase-realtime-database rxjs angular-promise

我正在尝试使用密钥从firebase中检索单个对象。我没有为.subscribe()方法实现OnDestroy,而是想使用take()属性来获取单个对象,并完成它。

问题是我收到错误“类型void上不存在属性”  并且控制台中的错误是“未定义不是对象”。我已经搜索过,似乎无法找到解决方案。

constructor(
    private router: Router,
    private route: ActivatedRoute,
    private categoryService: CategoryService,
    private productService: ProductService) {
    this.categories$ = categoryService.getCategories();

    const id = this.route.snapshot.paramMap.get('id');
    if (id)  {
      this.productService.get(id).take(1).subscribe(p => this.product = p);
    }
  }

我导入了rxjs / add / operator / take。

编辑: 以下是我的ProductService类

export class ProductService {

  constructor(private db: AngularFireDatabase) { }

  create(product) {
    return this.db.list('/products').push(product);
  }

  getAll() {
    return this.db.list('/products').snapshotChanges();
  }

  get(productId) {
    return this.db.object('/products/' + productId);
  }

}

这是我在控制台中遇到的错误:

  

错误:未捕获(在承诺中):TypeError:   this.productService.get(id).take不是一个函数。 (在   'this.productService.get(ID)。取(1)',   'this.productService.get(id).take'未定义)

1 个答案:

答案 0 :(得分:1)

看起来你正试图打电话给take,而不是一个Observable。

我的猜测是this.productService.get(id)的类型为AngularFireObject<T>}:

export interface AngularFireObject<T> {
  query: DatabaseQuery;
  valueChanges(): Observable<T | null>;
  snapshotChanges(): Observable<SnapshotAction>;
  update(data: Partial<T>): Promise<void>;
  set(data: T): Promise<void>;
  remove(): Promise<void>;
}

您需要使用valueChanges(或snapshotChanges)来获取Observable:

this.productService.get(id).valueChanges().take(1).subscribe(p => this.product = p);

另请参阅:Retrieving data as objects