У меня есть следующая фабрика провайдеров для динамически рассчитанного пути к пожарной базе:
const meetingServiceFactory = (db: AngularFirestore, authService: AuthService ) => {
const userId = authService.user;
return new MeetingService('/users/' + userId + '/meetings', db);
};
export let meetingServiceProvider = { provide: MeetingService,
useFactory: meetingServiceFactory,
deps: [AngularFirestore, AuthService] };
Здесь MeetingService
:
@Injectable(
{
providedIn: 'root'
}
)
export class MeetingService extends FirestoreDataService<Meeting> {
constructor(path: string, db: AngularFirestore) {
super(path, db);
}
setProposalFlag(meetingKey: string) {
return from(this.db.doc(this.path + `/${meetingKey}`).update({hasProposal: true})
.then(result => console.log('changed active Flag on meeting: ', result))
.catch(err => console.log(err)));
}
saveMeeting(meeting: Meeting) {
return of(meeting).pipe(
map(meetingToSave => {
return {...meetingToSave, key: this.db.createId() };
}),
switchMap( finalMeeting => this.addItemWithKey(finalMeeting.key, finalMeeting) )
);
}
getAll() {
return this.getItems();
}
}
Это наследуется от FirestoreDataService<T>
, так что яесть тип службы CRUD для повторного использования:
@Injectable()
export class FirestoreDataService<T> {
protected itemCollection: AngularFirestoreCollection<T>;
protected items$: Observable<T[]>;
protected snapshot$: Observable<DocumentChangeAction<T>[]>;
protected state$: Observable<DocumentChangeAction<T>[]>;
constructor(protected path: string, protected db: AngularFirestore) {
this.itemCollection = this.db.collection<T>(path);
this.items$ = this.itemCollection.valueChanges();
this.snapshot$ = this.itemCollection.snapshotChanges();
this.state$ = this.itemCollection.stateChanges();
}
getItems(): Observable<T[]> {
return this.items$;
}
getItemWithKey( key: string): Observable<T> {
// used to use stateChanges here.
// as the doc states, this only emits recent changes,
// so if we subscribe in an async pipe, it will not reemit and subsequent observables will be empty.
return this.itemCollection.doc<T>(key).valueChanges();
}
addItem(data: T) {
return from(this.itemCollection.add(data)
.catch(err => console.log('Error while adding item: ', err)));
}
addItemWithKey(key: string, data: T) {
return from(this.itemCollection.doc(key).set(data)
.catch(err => console.log('Error while adding item: ', err)));
}
deleteItem(key: string) {
return from(this.itemCollection.doc(key).delete()
.catch(err => console.log('Error while deleting item: ', err)));
}
}
, но это, очевидно, зависит от времени выполнения решения по userId.Кажется, работает нормально в ng serve
, но при переносе для prod я получаю: ERROR in : Can't resolve all parameters for FirestoreDataService in /web-client/src/app/core/services/firestore-data.service.ts: (?, [object Object]).
Я предполагаю, что это потому, что я не знаю точный путь во время компиляции.Это так?Если нет, что может быть проблемой с этой настройкой?И как бы это исправить / улучшить?Я бегу Angular 7 в данный момент.Спасибо за помощь!