【问题标题】:Why can I not call toArray() on FirebaseListObservable?为什么我不能在 FirebaseListObservable 上调用 toArray()?
【发布时间】:2017-06-22 01:18:48
【问题描述】:

在离子项目中,我有:

import { AngularFireDatabase, FirebaseListObservable} from 'angularfire2/database';

还有一个类:

songs: FirebaseListObservable<any>;

因此,代码行:

this.songs = db.list('/songs');

工作,并允许我把线:

<button ion-button ouline *ngFor="let song of songs | async">

在我的 html 中没有问题。

现在,FirebaseListObservable 扩展了 RxJS Observable (source)。 此外,Observable 有一个方法toArray()。但是,当我运行我的项目时,我看到:

Typescript Error
Property 'toArray' does not exist on type 'FirebaseListObservable<any>'.

这是为什么?还有其他方法可以让我从songs 观察的内容中获取一个数组吗?

【问题讨论】:

  • AngularFire2 不会完全导入 RxJS,也不会使用修补 Observable 原型的导入。您需要自己导入toArray 原型补丁。请参阅docs
  • 我在代码中添加了import 'rxjs/add/operator/toArray;'这一行,但随后看到了这个错误:Type "Observable&lt;any[]&gt;" is not assignable to type "any[]". Property "length" is missing in type "Observable&lt;any[]&gt;".

标签: firebase rxjs observable angularfire2


【解决方案1】:

我不太确定为什么toArray() 不起作用,但我可以建议您一种从数据库中获取所需数组的方法。(当我只想要数组而无法收听时,我通常会这样做对数据库的任何更改 - 就像 Observable 所做的那样):

this.db.list('/songs')
.first().toPromise()
.then(response => {
  //code to handle the response - in this case its a list

  This.items = response;
})
.catch(error => { //error code here });

别忘了先导入 rxjs 和 toPromise

我真的希望它符合您的愿望并帮助您:)

【讨论】:

  • 谢谢,你能告诉我应该在//code to handle the response - in this case its a list 中输入什么吗?
  • 哦,我明白了——如果我愿意,我可以把那部分留空,this.items 仍然是我想要的列表。
  • 如果我在该匿名函数中执行console.log(response),那么它会显示我想要的数组,但this.items 不是我想要的。所以我尝试将var data; 放在该代码之上,然后在函数内部分配data = response;,但这也不起作用。如何将respond 分配给另一个变量?
  • 您可以尝试将响应分配给 this.items 。我将编辑我的答案以向您展示我的意思。
  • 好的,非常感谢。这行得通,但是因为它不会立即将this.items 更改为response,所以如果我尝试用this.items 做某事,我不知道它是否具有旧值或新值。我如何保证this.items 在我处理它时已更新?或者对于 cmets 部分来说,这个问题太复杂并且没有完整的上下文?
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 2019-03-02
  • 2017-10-14
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
相关资源
最近更新 更多