У меня есть маршрут, которому нужны некоторые данные из моей базы данных Firebase перед загрузкой маршрута. Такое ощущение, что Route не вызывает подписку, поэтому запрос никогда не запускается. Я пропускаю шаг?
(угловой 5)
Мой роутер:
{
path: 'class/:idName',
component: ClassComponent,
resolve: {
classData: ClassResolver
}
},
Мой резольвер:
@Injectable()
export class ClassResolver implements Resolve<any> {
constructor(
private db: AngularFireDatabase
) {}
resolve(route: ActivatedRouteSnapshot): Observable<any> | Promise<any> | any {
// return 'some data'; //This worked fine
return this.db
.list('/')
.valueChanges() // Returns Observable, I confirmed this.
//.subscribe(); // This returns a Subscriber object if I call it and I never get any data
}
// I tried this and it didnt work either
//const list = this.db
// .list('/')
// .valueChanges();
//console.log('list', list); // Is a Observable
//list.subscribe(data => {
// console.log('data', data); // returned data
// return data;
//});
//return list; // never gets to the component
}
Мой компонент:
public idName: string;
// Other vars
constructor(
private fb: FormBuilder,
private route: ActivatedRoute,
private db: AngularFireDatabase
) {
// Form stuff
}
ngOnInit() {
// Never makes it here
this.idName = this.route.snapshot.params.idName;
const myclass = this.route.snapshot.data.classData;
console.log('myclass', myclass);
}
Я никогда не доберусь до компонента. Он ожидает загрузки компонента, чего он никогда не делает. Если я добавлю подписку и console.out к данным, они вернутся довольно быстро с правильными данными, поэтому это не служба.
======
Edit:
После вызова .subscribe()
в моем резольвере, который теперь возвращает Subscriber
объект. Потому что моя подпись возврата позволяет any
возвращать эту Subscriber
, как если бы это были данные. Это кажется очевидным.
Теперь у меня возникает вопрос, почему не разрешается моя наблюдаемая?
Обновленный заголовок и текст выше
======
Решено:
Я обнаружил эту проблему (https://github.com/angular/angularfire2/issues/624), по-видимому, это проблема в библиотеке Firebase, которую я использую. Их Observables не запускаются маршрутами. Она была поднята в 2016 году и до сих пор проблема. Я не думаю, что это будет исправлено.
Обходной путь, который я нашел, был таким
resolve(route: ActivatedRouteSnapshot): Observable<any> | Promise<any> | any {
return this.db
.list('/', ref => ref.orderByChild('idName').equalTo(route.params.idName))
.valueChanges()
.first();
}