angular – 如何使用snapshotChanges()方法获取键值并过滤数据?
发布时间:2020-12-17 17:05:19 所属栏目:安全 来源:网络整理
导读:我正在开发一个Angular Firebase项目,我需要过滤我的数据库并获取关键值.目前我在我的服务代码中使用valueChanges()方法(在getUnreadBooks和getFavoriteBooks方法中,如下所示)来获取数据并对其进行过滤.但是当我尝试在模板文件中获取键值时,它给我的关键值为
我正在开发一个Angular Firebase项目,我需要过滤我的数据库并获取关键值.目前我在我的服务代码中使用valueChanges()方法(在getUnreadBooks和getFavoriteBooks方法中,如下所示)来获取数据并对其进行过滤.但是当我尝试在模板文件中获取键值时,它给我的关键值为’undefined’.我尝试使用snapshotChanges()方法,但无法解决如何使用它来获取键值以及过滤数据.下面是我的Angular FirebaseService,home.component.ts(我在其中注入我的服务代码)和home.component.html(模板文件)代码:
import { Injectable } from '@angular/core'; import { AngularFireDatabase } from 'angularfire2/database'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/map'; @Injectable() export class FirebaseService { books: Observable<any[]>; unreadBooks; favoriteBooks; constructor(private db: AngularFireDatabase) {} getBooks(){ this.books = this.db.list('/books').valueChanges() as Observable<any[]>; return this.books; } getFavoriteBooks(){ this.favoriteBooks = this.db.list('/books').valueChanges() as Observable<any[]>; this.favoriteBooks = this.favoriteBooks.map(books => { const topRatedBooks = books.filter(item => item.rate>4); return topRatedBooks; }) return this.favoriteBooks; } getUnreadBooks(){ this.unreadBooks = this.db.list('/books').valueChanges() as Observable<any[]>; this.unreadBooks = this.unreadBooks.map(books => { const ub = books.filter(item => item.dateread == null); return ub; }) return this.unreadBooks; } } Home.Component.ts file => import { Component,OnInit } from '@angular/core'; import { FirebaseService } from '../../services/firebase.service'; @Component({ selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.css'] }) export class HomeComponent implements OnInit { //favorite Books favoriteBooks: any; unreadBooks: any; constructor(private firebaseService: FirebaseService) { } ngOnInit() { this.firebaseService.getFavoriteBooks() .subscribe(favBooks => { this.favoriteBooks = favBooks; console.log(this.favoriteBooks); }) this.firebaseService.getUnreadBooks() .subscribe(ubBooks => { this.unreadBooks = ubBooks; console.log('Unread Books:',this.unreadBooks); }) } } Home.component.html file => <mat-toolbar> My Top Rated Books </mat-toolbar> <mat-grid-list cols="3"> <mat-grid-tile *ngFor="let book of favoriteBooks"> <mat-card> <mat-card-header> <mat-card-title> <h4>{{book.title}}</h4> </mat-card-title> </mat-card-header> <img mat-card-image src="{{book.imageUrl}}" alt="{{book.title}}"> <mat-card-actions> <button mat-button mat-raised-button class="detailsButton" [routerLink]="['/book/'+book.$key]"> <i class="material-icons">visibility</i>Book Details</button> <button mat-button mat-raised-button class="editButton" [routerLink]="['/editbook/'+book.$key]"> <i class="material-icons">mode_edit</i>Edit Book</button> </mat-card-actions> </mat-card> </mat-grid-tile> </mat-grid-list> <mat-toolbar> Books I have not read yet </mat-toolbar> <mat-grid-list cols="3"> <mat-grid-tile *ngFor="let book of unreadBooks"> <mat-card> <mat-card-header> <mat-card-title> <h4>{{book.title}}</h4> </mat-card-title> </mat-card-header> <img mat-card-image src="{{book.imageUrl}}" alt="{{book.title}}"> <mat-card-actions> <button mat-button mat-raised-button class="detailsButton" [routerLink]="['/book/'+book.$key]"> <i class="material-icons">visibility</i>Book Details</button> <button mat-button mat-raised-button class="editButton" [routerLink]="['/editbook/'+book.$key]"> <i class="material-icons">mode_edit</i>Edit Book</button> </mat-card-actions> </mat-card> </mat-grid-tile> </mat-grid-list> 解决方法
声明一个向您的Object添加id的函数:
documentToDomainObject = _ => { const object = _.payload.doc.data(); object.id = _.payload.doc.id; return object; } 并在你的getBooks方法中使用它: getBooks(){ this.books = this.db.list('/books').snapshotChanges() .pipe(map(actions => actions.map(this.documentToDomainObject))); return this.books; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |