【发布时间】:2020-07-31 11:03:26
【问题描述】:
我是 firebase 和 angular 新手,我想根据选定的过滤器在数据库中搜索事件,我进行了一些搜索并收集了一些代码以使其正常工作,但无法正常工作
collection events{
eventName: ...,
eventTicketPrice,
eventCategory
}
我设置了一些 observable 来监听过滤器按钮的变化,这是我的代码
items$: Observable<any[]>;
categoryFilter$: BehaviorSubject<string | null>;
priceFilter$: BehaviorSubject<string | null>;
nameFilter$: BehaviorSubject<string | null>;
dateFilter$: BehaviorSubject<string | null>;
ageFilter$: BehaviorSubject<string | null>;
startAt: BehaviorSubject<string | null>;
endAt: BehaviorSubject<string | null>;
// startobs = this.startAt.asObservable();
// endobs = this.endAt.asObservable();
constructor(
public eventService: EventsService,
private db: AngularFirestore
) {}
mobileSize = [425, 375, 320];
ngOnInit(): void {
this.mobileSize.forEach((width) => {
if (window.screen.width === width) {
// 768px portrait
this.mobile = true;
}
});
this.categoryFilter$ = new BehaviorSubject(null);
this.priceFilter$ = new BehaviorSubject(null);
this.nameFilter$ = new BehaviorSubject(null);
this.dateFilter$ = new BehaviorSubject(null);
this.ageFilter$ = new BehaviorSubject(null);
this.startAt = new BehaviorSubject(null);
this.endAt = new BehaviorSubject(null);
this.items$ = combineLatest(
this.categoryFilter$,
this.priceFilter$,
this.nameFilter$,
this.ageFilter$,
this.startAt.pipe(debounceTime(500), distinctUntilChanged()),
this.endAt.pipe(debounceTime(500), distinctUntilChanged())
).pipe(
switchMap(([category, price, name, age, start, end]) =>
this.db.collection('events', ref => {
let query : firebase.firestore.Query = ref;
if (category !== null) { query = query.where('eventCategory', '==', category) };
if (price == 'high' && price !== null) { query = query.orderBy('eventTicketPrice', 'desc') };
if (price == 'low' && price !== null) { query = query.orderBy('eventTicketPrice', 'asc') };
if (name == 'asc' && name !== null) { query = query.orderBy('eventName', 'asc') };
if (name == 'desc' && name !== null) { query = query.orderBy('eventName', 'desc') };
if (age !== null) { query = query.where('ageCategory', '==', age) };
if (start && end !== null) { query = query.orderBy('eventName').startAt(start).endAt(end) };
return query;
}).valueChanges({ idField: 'id' }))
);
目前,我可以按一个类别过滤器进行过滤,但在选择价格过滤器和年龄过滤器等多个过滤器后,我无法过滤数据,
基本上我想通过选择过滤器来搜索数据
【问题讨论】:
-
“选择多个文件管理器后我无法过滤数据” 您似乎有相当广泛的查询构建代码。你给它添加额外的条件有什么问题?
-
谢谢您,先生,您的回复,我正在尝试从事件集合中获取事件,并且我已将单选按钮(过滤器)和 HTML 中的搜索框与观察者一起放置,我也有在firestore中创建了索引,上面的代码工作正常,过滤器也在工作,但是当我开始在搜索框中搜索一个事件时,只有一个过滤器被应用,即类别,在选择其他过滤器后我没有得到任何结果,比如价格和年龄
标签: javascript angular firebase google-cloud-firestore angularfire2