首页 文章

遇到take()属性的问题

提问于
浏览
0

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

问题是我得到一个错误“类型为void的属性不存在”,控制台中的错误是“Undefined is not object” . 我已经搜索过,似乎无法找到解决方案 .

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).take(1)'中,'this.productService.get(id).take'未定义)

1 回答

  • 1

    看起来你试图在某些不是Observable的情况下调用 take .

    我的猜测 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

相关问题