使用 Ionic + Firebase 开发一个日历应用 – 第三步: 向 Firebase 中添加和获取事件

完成的形象 de

就是这样的。 pic.twitter.com/CvOFjFq2th— げん げんと (@gento34165638) 2019年11月2日

首先

环境如下:
– Ionic4
– 使用Capacitor作为与原生桥接工具
– 采用了名为ionic2-calendar的库来实现日历功能

上次进行了实机测试。
上一篇文章在这里。

Firebase的设置

我会参考这个并继续努力。

安装图书馆。

在项目文件夹内

npm install firebase @angular/fire

我已经成功在项目中引入了Firebase。

在Firebase侧创建项目。

スクリーンショット 2019-10-14 20.50.49.jpg

在消息发送方ID下可能添加了应用程序ID。

スクリーンショット 2019-10-14 22.05.35.jpg

将Firebase信息添加到Ionic项目中。

将”environment”文件添加进去。

打开 src/environments/environment.ts 文件。

export const environment = {
  production: true,
  firebase: {
   apiKey: "YOUR_API_KEY",
   authDomain: "YOUR_AUTH_DOMAIN",
   databaseURL: "YOUR_DATABASE_URL",
   projectId: "YOUR_PROJECT_ID",
   storageBucket: "YOUR_STORAGE_BUCKET",
   messagingSenderId: "YOUR_SENDER_ID"
   appId: "YOUR_APP_ID"
  }
};

将信息放入名为firebase的变量中。

顺便提一下,默认情况下,创建的环境文件是environment.prod.ts作为生产环境的文件,而environment.ts则是用于开发环境的文件。

将environment信息存储在app.module中。

将app.module.ts文件进行如下更改:

import { NgModule, LOCALE_ID } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';

//カレンダー関係
import { NgCalendarModule  } from 'ionic2-calendar';
import { registerLocaleData } from '@angular/common';
import localeJa from '@angular/common/locales/ja';

//Firebaseを利用するためのモジュール
import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';
import { AngularFireAuthModule } from '@angular/fire/auth';

//Firebase設定情報ファイルをインポート
import { environment } from '../environments/environment';

registerLocaleData(localeJa);


@NgModule({
  declarations: [AppComponent],
  entryComponents: [],
  imports: [
    BrowserModule,
    IonicModule.forRoot(),
    AppRoutingModule,
    NgCalendarModule,
    AngularFireModule.initializeApp(environment.firebase, 'myCarendar'),
    AngularFirestoreModule,
    AngularFireAuthModule
  ],
  providers: [
    StatusBar,
    SplashScreen,
    NativeStorage,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
    { provide: LOCALE_ID, useValue: 'ja-JP' }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

如果说AngularFireModule的话,那就是Firebase的核心部分。

AngularFirestoreModule是Firebase核心中的一个功能,用于访问数据库Cloud Firestore。

AngularFireAuthModule是用于将来用户认证(登录等)所使用的功能。

//Firebaseを利用するためのモジュール
import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';
import { AngularFireAuthModule } from '@angular/fire/auth';

用这个准备工作已经完成。呼。。

在日历上添加事件。

随便在日历上加一个按钮。

<ion-header>
  <ion-toolbar color="primary">
    <ion-title>
      {{ viewTitle }}
    </ion-title>
    <ion-buttons slot="end">
      <ion-button (click)="today()">Today</ion-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ion-content padding>
<ion-button (click)="addNewEvent()">イベント追加</ion-button>

  <calendar
  [eventSource]="eventSource" 
  [calendarMode]="calendar.mode" 
  [currentDate]="calendar.currentDate"
    (onCurrentDateChanged)="onCurrentDateChanged($event)" 
    (onEventSelected)="onEventSelected($event)" 
    (onTitleChanged)="onViewTitleChanged($event)"
    (onTimeSelected)="onTimeSelected($event)"
     step="30">  
  </calendar>
</ion-content>

编写addNewEvent函数并将事件添加到数据库中。

import { Component } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore';


@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})
export class HomePage {
  eventSource = [];
  viewTitle;
  selectedDate = new Date();
  calendar = {
    mode: 'month',
    currentDate: new Date(),
    locale: 'ja-JP'
  };

  constructor(
    private db: AngularFirestore,
) { }

  onViewTitleChanged(title) {
    this.viewTitle = title;
  }

  // 選択した日付を取得
  onTimeSelected(ev) {
    this.selectedDate = ev.selectedTime;
  }

  today() {
    this.calendar.currentDate = new Date();
  }

  async onEventSelected() {
    console.log('onEventSelected');
  }

  eventSelected(event) {

  }


  onCurrentDateChanged(event: Date) { }

}

addNewEvent() {
    let start = this.selectedDate;
    let end = this.selectedDate;
    end.setMinutes(end.getMinutes() + 60);

    let event = {
      title: 'イベント' + start.getMinutes(),
      startTime: start,
      endTime: end,
      allDay: false
    };
    console.log(event);
    this.db.collection(`events`).add(event);
  }

当你点击事件添加按钮后,查看Firebase数据库,是否在名为events的集合中存在事件的文档。

如果对“收藏”和“文档”的含义不清楚,请了解Cloud Firestore的数据模型。点击此处了解更多详情。

将事件获取并显示在日历上

在home.page.ts的构造函数中添加以下内容。

 constructor(
    private db: AngularFirestore,
) { 
         this.db.collection(`events`)
          .snapshotChanges()
          .subscribe(colSnap => {
            this.eventSource = [];
            colSnap.forEach(snap => {
              const event: any = snap.payload.doc.data();
              event.id = snap.payload.doc.id;
              event.startTime = event.startTime.toDate();
              event.endTime = event.endTime.toDate();
              this.eventSource.push(event);
            });
          });
 }

暫時這樣是否能在日曆上顯示事件?

最后

从第4天的页面中添加活动。
在第4天的页面中增加活动。
从day4页面添加事件。

如果你感兴趣的话,可以在各个商店进行下载。请随便试用一下。

苹果商店

谷歌应用商店

bannerAds