【问题标题】:Having an issue with the take() propertytake() 属性有问题
【发布时间】:2018-02-21 07:43:04
【问题描述】:

我正在尝试使用键从 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).take(1)', 'this.productService.get(id).take' 未定义)

【问题讨论】:

  • 您的productService 代码在哪里?问题是productService.get() 返回未定义。
  • 嗨@mdewitt,我用 productservice.get() 方法添加了我的 productservice 类。如果有帮助,这就是我在控制台中遇到的错误:错误:未捕获(承诺):TypeError:this.productService.get(id).take is not a function。 (在'this.productService.get(id).take(1)'中,'this.productService.get(id).take'未定义)
  • 我不确定,但这个问题似乎与angularjs 无关。它可能angular,也似乎是typescript而不是javascript;您可能想再次检查您的标签并找出哪些标签实际上适用。
  • 看来问题可能是您的get 没有返回您需要的list 一个take,它已经返回了一个object
  • this 有帮助吗? import {Observable} from 'rxjs/Rx';

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


【解决方案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 =&gt; this.product = p);

另见:Retrieving data as objects

【讨论】:

  • 这解决了我的问题。我直接将 .valueChanges() 和 snapshotChanges() 添加到 get 方法中。非常感谢先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多