通过AngularFire在Angular中使用CloudFirestore
Cloud Firestore 刚刚宣布作为一个新的数据库来填补 Firebase 实时数据库可能不是最佳工具的空白。 Cloud Firestore 是一个基于文档的 NoSQL 数据库。 数据库的根目录是集合(例如:todos、users、files),集合只能包含文档。 文档包含键值对,并且可以包含它们自己的集合,称为 subcollections。 因此,与传统 Firebase 实时数据库提供的平面 JSON 树相比,这使得构建具有更复杂层次需求的应用程序变得更加容易。
在这里,我们将介绍在 Angular 2+ 项目中使用与 Cloud Firestore 交互的基础知识。 您需要有一个 Firebase 帐户 并启用新数据库。
设置
首先,安装所需的 Firebase 软件包( 火力基地 & 角火2 ) 到您的 Angular 项目中:
$ yarn add firebase angularfire2 # or, using npm: $ npm install firebase angularfire2
然后将 AngularFireModule 和 AngularFirestoreModule 添加到您的应用模块:
app.module.tsc
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AngularFireModule } from 'angularfire2';
import { AngularFirestoreModule } from 'angularfire2/firestore';
import { environment } from '../environments/environment';
import { AppComponent } from './app.component';
请注意,我们在 AngularFirestoreModule 上调用 enablePersistence 方法来自动启用 Chrome、Safari 和 Firefox 上的本地缓存,这将允许应用在离线时保持可用。
有了这个,您的 Firebase 应用程序配置将位于 enviroment.ts 文件中,如下所示:
/环境/环境.ts
export const environment = {
production: false,
firebase: {
apiKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
authDomain: 'your-project-id.firebaseapp.com',
databaseURL: 'https://your-project-id.firebaseio.com',
projectId: 'your-project-id',
storageBucket: 'your-project-id.appspot.com',
messagingSenderId: 'XXXXXXXXXXXX'
}
};
基本用法
现在我们的应用已经配置了 Firebase,我们可以开始使用数据库了。 我们将围绕包含 todos 集合和该集合中包含 description 和 completed 的简单 todo 应用程序的想法演示一些 CRUD 操作 字段。
首先,您需要将可注入的 AngularFirestore 注入到您的组件中:
import { Component } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
@Component({ ... })
export class AppComponent {
constructor(private afs: AngularFirestore) {
// ...
}
}
要访问集合,您可以使用以下内容创建对它的引用:
this.todoCollectionRef = this.afs.collection('todos'); // a ref to the todos collection
创建对集合的引用不会进行任何网络调用,并且引用不存在的集合是安全的,因为如果需要,将自动创建集合。 没有任何文档的集合也将被自动删除。
然后,您可以通过在集合引用上调用 valueChanges() 来监听集合文档的更改:
this.todo$ = this.todoCollectionRef.valueChanges();
valueChanges 方法返回集合中文档的 observable。 还有一个 snapshotChanges 方法,它还返回 id 以及关于我们文档的元数据。 阅读使用 snapshotChanges 的示例。
因此,这是我们开始的 todo 应用程序,它将从数据库中获取 todos 集合中的文档:
app.component.ts
import { Component } from '@angular/core';
import {
AngularFirestore,
AngularFirestoreCollection
} from 'angularfire2/firestore';
import { Observable } from 'rxjs/Observable';
export interface Todo {
description: string;
completed: boolean;
}
@Component({ ... })
export class AppComponent {
todoCollectionRef: AngularFirestoreCollection<Todo>;
todo$: Observable<Todo[]>;
我们可以像这样简单地在模板中显示我们的待办事项:
app.component.html
<ul>
<li *ngFor="let todo of todo$ | async"
[class.completed]="todo.completed">
{{ todo.description }}
</li>
</ul>
添加项目
要在集合中添加新文档,只需在集合引用上调用 add :
addTodo(todoDesc: string) {
if (todoDesc && todoDesc.trim().length) {
this.todoCollectionRef.add({ description: todoDesc, completed: false });
}
}
由于我们的 todo 集合引用是针对我们的 Todo 接口键入的,TypeScript 编译器将知道应该使用 add 方法传递的数据的形状。
更新和删除项目
要更新或删除集合中的文档,我们还需要文档的 id,它不会通过 valueChanges 方法返回。 我们将稍微改变我们的实现以使用 snapshotChanges 方法,并且还包括每个待办事项文档的 id:
app.component.ts
import { Component } from '@angular/core';
import {
AngularFirestore,
AngularFirestoreCollection
} from 'angularfire2/firestore';
import { Observable } from 'rxjs/Observable';
export interface Todo {
id?: string;
description: string;
completed: boolean;
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
todoCollectionRef: AngularFirestoreCollection<Todo>;
todo$: Observable<Todo[]>;
我们映射 snapshotChanges 返回的 observable 以提取文档的 id 及其数据。
snapshotChanges 返回的操作属于 DocumentChangeAction 类型,并包含 类型 和 payload。 类型是 added、modified 或 removed 并且有效负载包含文档的 id、元数据和数据。
有了这个,一切都照旧,我们现在可以轻松地实现更新和删除 todo 文档,并将更改立即反映到我们的模板中:
app.component.ts(部分)
updateTodo(todo: Todo) {
this.todoCollectionRef.doc(todo.id).update({ completed: !todo.completed });
}
deleteTodo(todo: Todo) {
this.todoCollectionRef.doc(todo.id).delete();
}
了解更多
- 请参阅 AngularFire2 的 Github 存储库 和 Cloud Firestore 文档 以了解有关 API 和可用方法的更多信息。
- 请参阅我们的这篇文章,了解如何在 Angular 中使用 Firebase 实时数据库。