Могу ли я объединить строку в запрос для AngularFire? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь создать динамическую c форму поиска на веб-сайте с Angular 8, где пользователь может использовать различные выпадающие меню, чтобы выбрать, что искать в Firestore. В зависимости от различных вариантов, у меня есть функция, которая создает строку, которая имеет ту же форму, что и запрос, хотя это строка. Но я не могу понять, как потом использовать его вместе с valueChanges(), как я хочу, так как это все еще строка. Возможно ли это?

Я полагаю, что это не очень элегантный (если вообще возможный) способ выполнения динамических c запросов, но если это возможно, я думаю, что это сэкономит мне драгоценное время в данный момент. , (Я также видел, как создавать фильтры с BehaviourSubjects и switchMap, поэтому я думаю, что это другой (лучший?) Способ, если это не работает.)

async getRealTimeData(value) {
  this.query = await this.makeQuery(value);
  this.data = this.query.valueChanges();
}

async makeQuery(value) {
  var collection: string;
  switch (value.collection) {
    case 'X':
      collection = 'X';
      this.queryString = ".where('datetime', '>=', '2020-01-15T09:51:00.000Z')";
      break;
    case 'Y':
      collection = 'Y';
      this.queryString = ".orderBy('ID', 'asc')";
      break;
  }

  // If Z chosen, add to search string 
  if (value.Z) {
    this.queryString = this.queryString.concat(".where('Z', '==', value.Z)");
  }
  // If not viewAllUser, add list of permitted
  else if (this.authService.viewAllUser == false) {
    this.queryString = this.queryString.concat(".where('ID', 'in', this.permitted");
  }
  this.queryString = this.queryString.concat(".orderBy('datetime', 'desc')");
  // If realtime, add limit to search string
  // (If download: no limit)
  if (this.searchType == "realtime") {
    this.queryString = this.queryString.concat('.limit(100)');
  }

  this.query = this.query.concat(this.queryString).concat(')');
  console.log('Query: ',this.query);

  return this.query;
}

1 Ответ

1 голос
/ 21 апреля 2020

Вы захотите прекратить использование строк для определения запроса. Чтобы превратить строку в исполняемый код, вам потребуется eval(), что не является безопасной операцией во многих средах. Но это также не нужно, так как вместо этого вы можете использовать аналогичный шаблон для построения запроса.

async makeQuery(value) {
  switch (value.collection) {
    case 'X':
      this.query = this.query.where('datetime', '>=', '2020-01-15T09:51:00.000Z');
      break;
    case 'Y':
      this.query = this.query.orderBy('ID', 'asc');
      break;
  }

  // If Z chosen, add to query
  if (value.Z) {
    this.query = this.query.where('Z', '==', value.Z);
  }
  // If not viewAllUser, add list of permitted
  else if (this.authService.viewAllUser == false) {
    this.query = this.query.where('ID', 'in', this.permitted);
  }
  this.query = this.query.orderBy('datetime', 'desc');
  // If realtime, add limit to search string
  // (If download: no limit)
  if (this.searchType == "realtime") {
    this.query = this.query.limit(100);
  }

  return this.query;
}

Вы увидите, что код все еще очень похож на ваш, но теперь создает реальный запрос вместо объединения строк.

...