We'll be using Todos in the post for our examples. Each todo has a content string value for the todo description and a done boolean to indicate if the todo item is completed.
Setup
First you’ll want to import AngularFireDatabase and AngularFireList as well as inject the former in your constructor:
app.component.ts
import { Component, OnInit } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { AngularFireDatabase, AngularFireList }
from 'angularfire2/database';
@Component({ ... })
export class AppComponent implements OnInit {
todos$: AngularFireList<any[]>;
constructor(private af: AngularFireDatabase) {}
ngOnInit() {
// ...
}
addTodo(value: string): void {
// ...
}
deleteTodo(todo: any): void {
// ...
}
toggleDone(todo: any): void {
// ...
}
updateTodo(todo: any, newValue: string): void {
// ...
}
}
You’ll also want to make sure that AngularFireDatabase is provided in your app module:
// ...
import { AngularFireModule } from 'angularfire2';
import { environment } from '../environments/environment';
import { AngularFireDatabase } from 'angularfire2/database';
@NgModule({
declarations: [
AppComponent
],
imports: [
// ...
AngularFireModule.initializeApp(environment.firebase),
AngularFireAuthModule
],
providers: [AngularFireDatabase],
bootstrap: [AppComponent]
})
export class AppModule { }
Reading Todos
imply declare a class property of type AngularFireList and get the /todos node from your Firebase database with AngularFireDatabase.list in the OnInit lifecycle hook:
todos$: AngularFireList<any[]>;
ngOnInit() {
this.todos$ = this.af.list('/todos');
}
The returned observable will contain all the todos that are under /todos in your database. You can also pass-in an object as the second argument to provide querying or filtering options. Let’s say we only want the first 3 todo items:this.todos$ = this.af.list('/todos', ref =>
ref.limitToFirst(3)
);
You can unwrap the observable to display the todo items in your template using the async pipe like this:<ul>
<li *ngFor="let todo of (todos$ | async)" [class.done]="todo.done">
{{ todo.content }}
</li>
</ul>
Creating Todos
Adding a new todo item is really easy, just call push on your AngularFireList instance:
addTodo(value: string): void {
this.todos$.push({ content: value, done: false });
}
Updating and Deleting Todos
To update or delete a todo, things are a bit different because you’ll need a reference to the todo item that is to be updated or deleted. This can be done with AngularFireDatabase.object. Objects inside a Firebase have a unique key available as $key:
Updating Todos
Here’s how you would toggle the completed state of a todo:
toggleDone(todo: any): void {
this.af.object('/todos/' + todo.$key)
.update({ content: todo.content, done: !todo.done });
}
Or update its content:
updateTodo2(todo: any, newValue: string): void {
this.af.object('/todos/' + todo.$key)
.update({ content: newValue, done: todo.done });
}
As an alternative to the update method on a Firebase object, you could also use set. Using the set method will create a new item if one doesn't exist and replaces to whole object, so its destructive.
Deleting Todos
Deleting an item is just as easy as updating it:
deleteTodo(todo: any): void {
this.af.object('/todos/' + todo.$key).remove();
}
Note that set, update and remove return a promise to you can chain then/catch calls to let you act on a successful operation or an error.
Comments (0)