Как динамически добавлять параметры в запрос FireStore и сопоставить с объектом - PullRequest
0 голосов
/ 06 ноября 2019

Каков рекомендуемый способ сопоставления данных с объектом и возврата их в качестве обещания / наблюдаемого при возможности добавления динамических / условных параметров в запрос.

В getCompanies2Я могу динамически добавлять параметры в запрос, но не могу понять, как сопоставить данные, возвращенные моему объекту, и вернуть их как обещание / наблюдаемое.

В getCompanies все работает так, как я хочу, но мне нужно продублировать код (как показано ниже), если у меня есть динамические параметры запроса для добавления.

Примечание: convertDocTimeStampsToDate просто делает то, что говорит. Я исключил его, чтобы уменьшить размер раздела кода.

getCompanies(searchText: string, useWhereActive: boolean): Observable<Company[]> {
    if (useWhereActive) {
      return this.db.collection('companies', ref => ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
      .where('active', '==', true)
    )
      .snapshotChanges()
      .pipe(
        map(snaps => convertSnaps<Company>(snaps)),
        first()
      );
    } else {
      return this.db.collection('companies', ref => ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff')
    )
      .snapshotChanges()
      .pipe(
        map(snaps => convertSnaps<Company>(snaps)),
        first()
      );
    }
  }
​
getCompanies2(searchText: string, useWhereActive: boolean) {
    let query = this.db.collection('companies').ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff');
​
    if (useWhereActive) {
      query.where('active', '==', true);
    }
​
    query.get().then(querySnapshot => {
      const results = this.convertDocuments<Company>(querySnapshot.docs);
      console.log(results);
    });
}


convertDocuments<T>(docs) {
    return <T[]>docs.map(doc => {
      return {
        id: doc.id,
        ...doc.data()
      };
    });
}

export function convertSnaps<T>(snaps) {
  return <T[]>snaps.map(snap => {
    const data = convertDocTimeStampsToDate(snap.payload.doc.data());
    return {
      id: snap.payload.doc.id,
      ...data
    };
  });
}

1 Ответ

0 голосов
/ 06 ноября 2019

Я заставил его работать, как показано ниже, я думаю, я все еще продолжаю выполнять свои обещания.

Будут приняты любые лучшие решения, так как я все еще учусь и не знаю, является ли это лучшим методом.

getCompanies2(searchText: string, useWhereActive: boolean) {
    let query = this.db.collection('companies').ref
      .orderBy('name').startAt(searchText).endAt(searchText + '\uf8ff');

    if (useWhereActive) {
      query.where('active', '==', true);
    }

    return query.get().then(querySnapshot => {
      return this.convertDocuments<Company>(querySnapshot.docs);
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...