在Angular项目中引入Firebase
这篇文章是有关使用Angular+Firebase创建聊天应用程序的入门指南。
前一篇文章:Firebase的环境设置
下一篇文章:实现Angular+Cloud Firestore的增删查改操作。
在这篇文章中所要做的事情
在这篇文章中,我们将使用名为”angularfire”的库来将Firebase引入到Angular项目中。
-
- angularfireとfirebaseをインストール
- Cloud Firestoreを導入する
AngularFire 是什么
这是一个使用Angular进行封装的方便易用的Firebase客户端。其特点是使用RxJS来实现客户端与Firebase之间的同步。目前(2018年9月),它支持Cloud Firestore、Realtime Database、Authentication、Cloud Storage、Firebase Messaging、Cloud Functions和Analytics。官方网站上也有介绍。
(2018/1更新)我已经将RTDB的描述更改为最新版本。
(2018/9更新)由于angularfire的支持,我已将描述更改为Firestore。
(2020/6更新)我正在更新为当前(2020年6月)最新内容。
实施内容
安装AngularFire和Firebase。
首先,在项目中安装angularfire和firebase。
cd 自分のプロジェクト
ng add @angular/fire@next
Please select a project:
> NgChat (ngchat-xxx)
(2020/06追記)这个命令在firebase官方文档和angularfire官方文档中有所不同。在进行测试时,请确认使用的是运行时的angularfire官方文档。
安装完成后,进行环境设置。
打开Firebase控制台,进入设置>“一般”选项卡,选择Firebase SDK片段中的“配置”。
复制其中的配置,打开/src/environments/environment.ts并输入。(将<>中的部分替换为自己的apiKey)。
// <>となっている部分は、自分のapiKeyを入力
export const environment = {
production: false,
firebase: {
apiKey: '<your-key>',
authDomain: '<your-project-authdomain>',
databaseURL: '<your-database-URL>',
projectId: '<your-project-id>',
storageBucket: '<your-storage-bucket>',
messagingSenderId: '<your-messaging-sender-id>',
appId: '<your-app-id>',
measurementId: '<your-measurement-id>',
}
};
请在/src/app/app.module.ts文件中打开,并编写代码来导入AngularFireModule和environment。
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { environment } from '../environments/environment'; // 追加
import { AngularFireModule } from '@angular/fire'; // 追加
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { ChatDatePipe } from './pipe/chat-date.pipe';
@NgModule({
declarations: [
AppComponent,
ChatDatePipe
],
imports: [
BrowserModule,
AppRoutingModule,
NgbModule,
FormsModule,
AngularFireModule.initializeApp(environment.firebase) // 追加,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
在Angular中,通过使用模块来管理外部库、组件等类。我们可以按照功能单元创建模块文件,并使用@Ngmodule装饰器来管理该功能模块所需的库模块、组件、服务等类。
@Ngmodule装饰器有几个属性,每个属性的作用都在这里得到了解释。主要的属性包括以下内容:
@Ngmodule({
// 注册在该模块内声明的指令(组件)和管道
declarations: [],
// 导入其他模块到自己的模块中
imports: [],
// 指定在其他模块中被导入到imports中的内容
exports: [],
// 注册在该模块内声明的服务
providers: [],
// 指定应用程序的入口点组件
bootstrap: []
})
在本项目中,我们将导入用于使用的AngularFire功能模块。
由于我们要使用身份验证和数据库,所以我们将导入AngularFireAuthModule和AngularFirestoreModule。
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { environment } from '../environments/environment'; // 追加
import { AngularFireModule } from '@angular/fire'; // 追加
import { AngularFirestoreModule } from '@angular/fire/firestore'; // 追加
import { AngularFireAuthModule } from '@angular/fire/auth'; // 追加
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { ChatDatePipe } from './pipe/chat-date.pipe';
@NgModule({
declarations: [
AppComponent,
ChatDatePipe
],
imports: [
BrowserModule,
AppRoutingModule,
NgbModule,
FormsModule,
AngularFireModule.initializeApp(environment.firebase), // 追加,
AngularFirestoreModule, // 追加
AngularFireAuthModule, // 追加
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
现在,库的安装已经完成了。
引入Cloud Firestore
我会在Cloud Firestore中尝试一下,看看库是否已经正确引入。
首先,我会在/src/app/app.component.ts文件中进行修改,将AngularFireDatabase进行DI(依赖注入),以便在这个组件中可以使用Cloud Firestore。
import { Component } from '@angular/core';
import { Comment, User } from './class/chat';
import { AngularFirestore } from '@angular/fire/firestore'; // 追加
import { Observable } from 'rxjs'; // 追加
export class AppComponent {
item: Observable<Comment>; // 追加
public content = '';
public comments = COMMENTS;
public current_user = CURRENT_USER;
// DI(依存性注入する機能を指定)
constructor(db: AngularFirestore) {
this.item = db
.collection('comments')
.doc<Comment>('item')
.valueChanges();
}
// 新しいコメントを追加
addComment(comment: string) {
if (comment) {
this.comments.push(new Comment(this.current_user, comment));
}
}
}
下面是一种可能的中文表述:
接下来,我们将修改/src/app/app.component.html文件。
<div class="page">
<section class="card">
<div class="card-header">
NgChat
</div>
<div class="card-body">
<ng-container *ngFor="let comment of comments">
<div class="media">
<div class="media-left" *ngIf="comment.user.uid !== currentUser.uid">
<a href="#" class="icon-rounded">{{comment.initial}}</a>
</div>
<div class="media-body">
<h4 class="media-heading">{{comment.user.name}} Date: {{comment.date | chatDate}}</h4>
<div>{{comment.content}}</div>
</div>
<div class="media-right" *ngIf="comment.user.uid === currentUser.uid">
<a href="#" class="icon-rounded">{{comment.initial}}</a>
</div>
</div>
<hr>
</ng-container>
<!-- Firestoreの反映箇所 -->
<div class="media">
<div class="media-left">
<a href="#" class="icon-rounded">{{(item | async)?.initial}}</a>
</div>
<div class="media-body">
<h4 class="media-heading">{{(item | async)?.user.name}}</h4>
<div>{{(item | async)?.content}}</div>
</div>
</div>
</div>
</section>
<section>
<form class="chart-form" (submit)="addComment(content)">
<div class="input-group">
<input type="text" class="form-control"
[(ngModel)]="content"
name="comment"
placeholder="Comment" />
<div class="input-group-append">
<button class="btn btn-info" type="submit">SEND</button>
</div>
</div>
</form>
</section>
</div>
在读取item数据时,使用了一个名为async的管道。
这个管道用于在异步加载到视图中时使用。这里使用了Angular中的Rxjs库的Observable,关于它的详细信息将在另一篇文章中解释。
只需提供一个选项:
客户端准备工作已经完成。
使用ng serve命令来运行项目将会在控制台输出错误日志。
ERROR in The target entry-point "@angular/fire" has missing dependencies:
- firebase/app
到2020年6月為止,僅通過ng add @angular/fire@next並不足夠,您還需要另外安裝Firebase的庫。
npm install firebase --save
接下来只需将数据存储在Cloud Firestore中。
首先,注册一个名为“comments”的collection作为数据的父集合。
接下来要注册下一个子项”item”。
为了能够确认执行结果,我们将更改规则以允许所有的写入和读取操作。
运行结果
确认了数据库更新会实时反映到聊天中。
接下来我们将实施Cloud Firestore的CRUD(创建、读取、更新、删除)操作。
源代码
请在此时点提供源代码。
※由于删除了apiKey,请在尝试时使用您自己创建的apiKey。