Как я могу подписаться на данные Firebase, используя AngularFire2 при начальной загрузке маршрута?
Я использую angular-cli для создания приложения angularfire2.
У меня возникла проблема, когда при начальной загрузке дочернего суб-маршрута angularfire2 выдает ошибку в консоли:
error_handler.js: 47 ИСКЛЮЧЕНИЕ: Uncaught (в обещании): TypeError: Невозможно прочитать свойство 'подписка' из неопределенного
Это происходит, когда моя страница "обновляется". Если после обновления перейти к компоненту и вернуться к нему, данные загружаются очень хорошо, и я не получаю сообщение об ошибке. Я не уверен, что это ошибка Angular2, AngularFire2, или я делаю что-то не так. У кого-нибудь была эта проблема? Вот мой соответствующий код компонента:
import {Component, OnInit, ViewChild, OnDestroy}from '@angular/core';
import {Router} from '@angular/router';
import {AngularFire, FirebaseListObservable, AngularFireModule} from 'angularfire2';
@Component({
selector: 'app-users',
templateUrl: 'users.component.html',
styleUrls: ['users.component.scss', '../shared/styles/dashboard.scss']
})
export class EmployeesComponent implements OnInit, OnDestroy {
private groupKey: string;
private groupAdmin: string;
private user: any;
private _auth: any;
private positions: FirebaseListObservable < any > ;
private users: FirebaseListObservable < any > ;
constructor(private af: AngularFire, private router: Router) {}
ngOnInit() {
this.af.auth.subscribe(auth => {
this._auth = auth;
let currentUser = this.af.database.object('/Users/' + this._auth.uid).take(1).subscribe(user => {
this.groupKey = user.group;
this.users = this.af.database.list('/Users', {
query: {
orderByChild: 'group',
equalTo: this.groupKey
}
});
this.positions = this.af.database.list('/Groups/' + this.groupKey + '/Positions');
this.af.database.object('/Groups/' + this.groupKey + '/admin').take(1).subscribe(group => {
this.groupAdmin = group.admin;
});
});
});
}
ngOnDestroy() {
this.users.subscribe().unsubscribe();
this.positions.subscribe().unsubscribe();
}
}
1 ответ
Вы должны переоборудовать свой ngOnDestroy
метод, потому что это неправильно, во-первых, если вы используете async
труба внутри вашего шаблона вам не нужно отписываться, а если нет, внутри вашего ngOnInit
Вы должны сохранить ссылку на unsubscribe
функция для каждого subscription
позвоните, а затем позвоните им ngOnDestroy
( Вы можете прочитать больше об этом здесь).