<html>
<head>
<base href=".">
<title>Angularfire2 Example</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="https://unpkg.com/core-js/client/shim.min.js"></script>
<script src="https://unpkg.com/zone.js@0.7.2?main=browser"></script>
<script src="https://unpkg.com/reflect-metadata@0.1.3"></script>
<script src="https://unpkg.com/systemjs@0.19.27/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>
<!-- 3. Display the application -->
<body>
<the-app>Loading...</the-app>
</body>
</html>
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true
}
}
import { Component } from '@angular/core';
import { AuthService } from './auth.service';
@Component({
selector: 'the-app',
template: `
<div style="width: 100%; margin-top: 20px;">
<a [routerLink]="['/projects']">Projects</a>
<button (click)="login()" style="float: right;">Login</button>
</div>
<router-outlet></router-outlet>
`,
})
export class AppComponent {
constructor(private _auth: AuthService) {
}
login() {
this._auth.login()
.then(result => {
console.log('AppComponent.login: Success! Navigate to project list!', result);
});
// Getting a typescript error when uncommented. Not sure why...
// .catch(error: Error => {
// console.error('AppComponent.login: Error!', error);
// });
}
}
import { NgModule } from '@angular/core'
import { BrowserModule } from '@angular/platform-browser'
import { Routes, RouterModule } from '@angular/router';
import { AngularFireModule } from 'angularfire2';
import { AngularFireAuthModule } from 'angularfire2/auth';
import { AngularFireDatabaseModule } from 'angularfire2/database';
import { AppComponent } from './app.component';
import { AuthService } from './auth.service';
import { ProjectsListComponent } from './projects/list.component';
import { ProjectsListService } from './projects/list.service';
const routes: Routes = [
{ path: 'projects', component: ProjectsListComponent },
];
@NgModule({
imports: [
BrowserModule,
AngularFireModule.initializeApp({
apiKey: 'AIzaSyDFbuKX0UeXje-PRAvwIymYo2jk-uGqMa4',
authDomain: 'test-bc800.firebaseapp.com',
databaseURL: 'https://test-bc800.firebaseio.com',
storageBucket: ''
}),
AngularFireAuthModule,
AngularFireDatabaseModule,
RouterModule.forRoot(routes),
],
declarations: [
AppComponent,
ProjectsListComponent,
],
providers: [
AuthService,
ProjectsListService,
],
bootstrap: [ AppComponent ]
})
export class AppModule {}
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { ProjectsListService } from './list.service';
@Component({
selector: 'app-projects',
templateUrl: './app/projects/list.component.html', // Plunker pathing HACK!!!
})
export class ProjectsListComponent implements OnInit {
constructor(
private _router: Router,
public projects: ProjectsListService
) { }
ngOnInit() {
console.log(`ProjectsListComponent.ngOnInit: Called!`, this);
}
goToDetailPage(clickedProject) {
this.router.navigate(['projects', clickedProject.$key]);
};
}
<h2>Projects List</h2>
<ul>
<li *ngFor="let project of projects.list | async" (click)="goToDetailPage(project)">
{{ project.projectTitle }}
</li>
</ul>
import { Injectable } from '@angular/core';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
@Injectable()
export class AuthService {
user: Observable<firebase.User>;
constructor(private _firebaseAuth: AngularFireAuth) {
this.user = _firebaseAuth.authState;
}
login(): Promise {
return this._firebaseAuth.auth.signInWithPopup(new firebase.auth.EmailAuthProvider());
}
logout() {
this._firebaseAuth.auth.signOut();
}
}
import { Injectable } from '@angular/core';
import * as firebase from 'firebase/app';
import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database';
import { AuthService } from '../auth.service';
@Injectable()
export class ProjectsListService {
list: FirebaseListObservable<any[]>;
constructor(private _db: AngularFireDatabase, private _auth: AuthService) {
this.onInit();
}
private onInit() {
this._auth.user.subscribe(user => { this.onAuthStateChanged(user); });
console.log('ProjectsListService.ngOnit: Executed!', this);
}
private onAuthStateChanged(state: firebase.User) {
this.list = this._db.list(`/projectsList/${state.uid}`);
}
}
(function (global) {
System.config({
// DEMO ONLY! REAL CODE SHOULD NOT TRANSPILE IN THE BROWSER
transpiler: 'ts',
typescriptOptions: {
tsconfig: true
},
meta: {
'typescript': {
"exports": "ts"
}
},
paths: {
'npm:': 'https://unpkg.com/'
},
//map tells the System loader where to look for things
map: {
'app': './app',
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
'@angular/animations': 'npm:@angular/animations/bundles/animations.umd.js',
'@angular/platform-browser/animations': 'npm:@angular/platform-browser/bundles/platform-browser-animations.umd.js',
'@angular/animations/browser': 'npm:@angular/animations/bundles/animations-browser.umd.js',
'rxjs': 'npm:rxjs',
'ts': 'npm:plugin-typescript@5.2.7/lib/plugin.js',
'typescript': 'npm:typescript@2.3.4/lib/typescript.js',
'angularfire2': 'npm:angularfire2',
'firebase': 'npm:firebase@3.9.0',
},
//packages defines our app package
packages: {
app: {
main: './main.ts',
defaultExtension: 'ts'
},
rxjs: {
defaultExtension: 'js'
},
angularfire2: {
main: 'angularfire2.js'
},
firebase: {
main: 'firebase.js'
}
}
});
})(this);