【问题标题】:AngularFire2 Getting Observable of type specific objectAngularFire2获取类型特定对象的Observable
【发布时间】:2018-12-12 05:33:32
【问题描述】:

我正在使用 Angular 和 Firebase 进行我的第一个项目。即使你一切正常,我还有一个关于获取特定类型对象的问题。例如,我有一个服务,它有一个名为 getAllNews() 的方法,但我希望这个返回是一个 News 类型(由我创建,有一个 NewsModel 文件)但是当我设置类型时,我从 TSLint 得到这个: [ts] Type 'Observable<{}[]>' is not assignable to type 'EventModel[]'. Property 'length' is missing in type 'Observable<{}[]>

有人可以在这里为我点亮一盏灯吗?非常感谢!

这是我的代码:

newsService.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireList } from '@angular/fire/database';
import { News } from '../news/news.model';
@Injectable({
  providedIn: 'root'
})
export class NewsService {

  NODE = 'news/';
  news: AngularFireList<News[]>;

  constructor(private db: AngularFireDatabase) { }

  getAllNews() {
    const localNews = this.db.list(this.NODE);
    return localNews.valueChanges();
  }

  getNews(id: string) {
    return this.db.object(this.NODE + id);
  }
}

news.model.ts

export class News {
    id: string;
    title: string;
    subtitle: string;
    article: string;
    picture: string;
}

news.component.ts

import { News } from './news.model';
import { Component, OnInit } from '@angular/core';
import { NewsService } from '../services/news.service';
import { Router } from '@angular/router';
import { NavController } from '@ionic/angular';

@Component({
  selector: 'app-news',
  templateUrl: './news.page.html',
  styleUrls: ['./news.page.scss'],
})
export class NewsPage implements OnInit {

  news: any;

  constructor(private newsService: NewsService, private router: Router, private navController: NavController) { }

  ngOnInit() {
    this.news = this.newsService.getAllNews();
  }

  go(id: string) {
    this.navController.navigateForward('news/' + id);
  }
}

【问题讨论】:

    标签: angular firebase firebase-realtime-database angularfire2


    【解决方案1】:

    您需要明确键入从AngularFireDatabase 返回的内容。您正在尝试将 Observable 分配给 EventModel[]。 Observables 不是数组,但它们可以发出数组。 Observable 的隐式输入是 {}

    我不明白EventModel[] 输入的来源。这几乎就像 news.component.ts 上的 news: any 最初是 news: EventModel[] 而 Intellisense 正在滞后。无论哪种方式,请尝试:

      getAllNews() {
        const localNews = this.db.list<News>(this.NODE); // now should return Observable<News[]>
        return localNews.valueChanges();
      }
    

    在 news.component 中:

      news: Observable<News[]>;
    
      constructor(private newsService: NewsService, private router: Router, private navController: NavController) { }
    
      ngOnInit() {
        this.news = this.newsService.getAllNews();
      }
    

    【讨论】:

    • 嘿@joh05667 谢谢。对于一个对象来说也是这样吗?另外,如果我得到那个对象并且我有一个链接到我的类的模型,我应该能够在我的模型上调用任何方法,对吗?例如,getFirstName()
    • 我不太清楚你在问什么。类型断言和类型安全是 Typescript 中的编译时优势,但对编译后的代码没有结果。给返回的对象一个强类型将允许您编写更多可扩展的代码。但是,您可以提供 objectany 的返回类型,这就像在 vanilla JS 中工作一样,没有类型安全。
    • 嗨,约翰,谢谢!很抱歉让我这么痛苦,但我仍然有问题。在我的课堂上,我得到了这个参考:currentUser: Observable&lt;UserProfile&gt;; 这是一个 UserProfile 类型的可观察对象。 UserProfile 是一个模型:uid: string; firstName: string; lastName: string; email: string; 在我的主计算机上,我有一个观察用户的方法,我想将其键入为 UserProfile this.currentUser = this.db.object('profile/' + user.uid).valueChanges(); 我得到:“Type Obervable不可分配给类型 Observable。类型 {} 缺少以下属性...
    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 2019-10-04
    • 2022-08-15
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2011-07-10
    相关资源
    最近更新 更多