有()属性有问题



我正在尝试使用钥匙从firebase检索一个对象。我不想为.subscribe((方法实现ondestroy,而是要使用take((属性,而只是获取一个对象,然后用它完成。

问题是我遇到了一个错误,即"属性在类型上不存在" 控制台中的错误是"未定义不是对象"。我已经搜索过,似乎无法找出解决方案。

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。

编辑:以下是我的产品服务类

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'是未定义的(

看起来您正在尝试在某种程度上调用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(获得可观察的:

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

另请参见:将数据检索为对象

最新更新