Ответ 1
Внутри, AngularFire2 вызывает Firebase initializeApp
в DI factory при создании FirebaseApp
.
Вы видите ошибку, потому что вы обращаетесь к глобальному экземпляру firebase
, а initializeApp
еще не вызван - поскольку инфраструктуре DI не нужно было создавать FirebaseApp
или любые его зависимости.
Вместо использования глобального firebase
вы можете ввести FirebaseApp
(это значение, возвращаемое функцией Firebase initializeApp
):
import { Component, Inject } from '@angular/core';
import { FirebaseApp } from 'angularfire2';
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor(@Inject(FirebaseApp) firebaseApp: any) {
const storageRef = firebaseApp.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
И, поскольку это больше не требуется, вы можете удалить declare var firebase : any;
.
Ранние версии модуля Firebase NPM не включали типизацию. Последние версии теперь включают их, поэтому свойство FirebaseApp
может быть строго типизировано следующим образом:
import { Component, Inject } from '@angular/core';
import { FirebaseApp } from 'angularfire2';
import * as firebase from 'firebase';
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor(@Inject(FirebaseApp) firebaseApp: firebase.app.App) {
const storageRef = firebaseApp.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
С рефакторингом, который сопровождал версию 4 релиз-кандидата AngularFire2, FirebaseApp
больше не является токеном, поэтому инъекция может быть упрощена
import { Component, Inject } from '@angular/core';
import { FirebaseApp } from 'angularfire2';
import 'firebase/storage';
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor(firebaseApp: FirebaseApp) {
const storageRef = firebaseApp.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
Однако требуется явный импорт firebase/storage
, потому что AngularFire2 теперь импортирует только те части API Firebase, которые он использует. (Обратите внимание, что есть предложение для поддержки хранилища.)