Ser*_*rgi 4 observable firebase typescript firebase-realtime-database angular
我正在 Angular 上制作我的第一个应用程序。我试图通过性别属性过滤书籍对象列表。我在组件之间共享数据有困难:filteredData变量和书籍列表FireBaseList。
我正在尝试将filteredData变量从fixed-nav.componentto传递给books-grid.component。根据我的研究,我知道我需要使books-grid.component“bookList”可以观察到任何更改,并让bookListonfixed-nav.component.ts对上的任何更改发出事件this.bookList
但是,我无法实现这一目标。我知道已经有很多关于 observable 的问题,但没有人使用 Firebase。希望有大神帮帮我,谢谢!!
我用作过滤器的固定导航组件
import { Component, OnInit } from '@angular/core';
import { BookService } from '../../../services/book.service';
import { Book } from '../../../models/book';
@Component({
selector: 'fixed-nav',
templateUrl: './fixed-nav.component.html',
styleUrls: ['./fixed-nav.component.css']
})
export class FixedNavComponent implements OnInit {
Genders: string[];
bookList: Book[];
constructor(private bookService: BookService) {
this.Genders = ["Historia","Literatura", "Infantil", "Juvenil","Poesía","Narrativa"];
}
filterByGender(gender: string){
this.bookService.getBooks() // FIREBASE
.snapshotChanges()
.subscribe(item => {
this.bookList = [];
item.forEach(element => {
let x = element.payload.toJSON();
x["$key"] = element.key;
this.bookList.push(x as Book)
})
const filteredData = this.bookList.filter( function(element){
return element.gender == gender;
});
return filteredData; // I WANT TO SHARE THIS DATA
})
}
ngOnInit() {
}
}
Run Code Online (Sandbox Code Playgroud)
书籍-grid.component.ts
import { Component, OnInit } from '@angular/core';
import { BookService } from '../../services/book.service';
import { Book } from '../../models/book';
@Component({
templateUrl: './books-grid.component.html',
styleUrls: ['./books-grid.component.css']
})
export class BooksGridComponent implements OnInit {
bookList: Book[];
constructor(private bookService: BookService) {}
ngOnInit() {
this.bookService.getBooks() // FIREBASE
.snapshotChanges()
.subscribe(item => {
this.bookList = [];
item.forEach(element => {
let x = element.payload.toJSON();
x["$key"] = element.key;
this.bookList.push(x as Book)
})
// SHARED DATA HERE
})
}
}
Run Code Online (Sandbox Code Playgroud)
书.service.ts
import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';
import { Book } from '../models/book'; // Model
@Injectable({
providedIn: 'root'
})
export class BookService {
bookList: AngularFireList<any>;
selectedBook: Book = new Book(); // Temporally save selected Book
constructor(private firebase: AngularFireDatabase) { }
getBooks(){
return this.bookList = this.firebase.list('books');
}
}
Run Code Online (Sandbox Code Playgroud)
书籍.model.ts
export class Book {
$key: string;
title: string;
author: string;
gender: string;
language: string;
image: string;
likes: number;
price: number;
new: boolean;
}
Run Code Online (Sandbox Code Playgroud)
在您book.service.ts创建一个filterdData变量和函数来设置filterdData如下。导入Subject使用import { Subject } from 'rxjs';
filteredData = new Subject<any>();
setFilteredData(data) {
this.filteredData.next(data);
}
Run Code Online (Sandbox Code Playgroud)
然后在你fixed-nav.component.ts完成后的过滤集中过滤数据,如下所示
this.bookService.setFilteredData(filteredData);
Run Code Online (Sandbox Code Playgroud)
最后从下面订阅filteredDatain并将数据分配到您想要的变量中。book.service.tsbooks-grid.component.ts
constructor(private bookService: BookService) {
bookService.filteredData.subscribe((data)=>{
// Assign the data into variable that you want e.g this.filteredData = data;
})
}
Run Code Online (Sandbox Code Playgroud)
希望这会帮助你!
| 归档时间: |
|
| 查看次数: |
3565 次 |
| 最近记录: |