angular: проблема с асинхронным валидатором форм, который использует результаты из нескольких наблюдаемых - PullRequest
0 голосов
/ 25 апреля 2018

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

Приложение, которое я создаю, представляет собой платформу для онлайн-аукционов, поэтому у меня есть структура, в которой «Предметы» принадлежат «Аукционам», и каждый предмет в рамках данного аукциона должен иметь уникальный «Номер лота».Также важно, чтобы пользователь мог назначать номер партии вручную, а не как автоматически назначаемый индекс.

Когда продавец вводит информацию о новом Предмете, я хочу выполнить проверку в моей базе данных (Firebase), чтобы определить, какой номер лота уже использовался на данном аукционе.Я пытаюсь выполнить эту проверку как асинхронный валидатор угловой формы.

Код, который у меня есть, таков:

Примечание: this.data - это имя службы, в которой я храню функции, которые нажимаютбаза данных.Они возвращают наблюдаемые.

uniqueLotNumberValidator(control: FormControl){
    return this.data.getItemsByAuction_snapshot(this.auctionId).map((itemsSnapList) => { 
      let itemObservableArray = [];
      itemsSnapList.forEach((snap) => {
        itemObservableArray.push(this.data.getItemLotNumberById(snap.key));
      })
      forkJoin(itemObservableArray).subscribe(lotNumbers => {
        let i = lotNumbers.length;
        while (i--) {
          if (lotNumbers[i] == control.value) {
            console.log('already in use');
              return { dubNumber: true };
          }
        }
        console.log('lot number is unique');
        return null;
      });
    });
   }

Чтобы пройти через то, что я пытается сделать:

Сначала data.getItemsByAuction_snapshot возвращает наблюдаемую информацию, которая предоставляет список ключей элементов, принадлежащихторг.

Затем я заполняю массив наблюдаемой (которая возвращает номер лота) для каждого из ключей, чтобы я мог сделать forkJoin и получить обратно массив каждого номера лота, используемого на аукционе.

В результате этого forkjoin у меня теперь есть массив всех используемых номеров лотов, и я перебираю их, чтобы сравнить каждое со значением пользовательского ввода.

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

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

1 Ответ

0 голосов
/ 25 апреля 2018

Решение, которое я нашел, состояло в том, чтобы вернуть новое обещание и поместить в него мой код:

  uniqueLotNumberValidator(control: FormControl){
    return new Promise((resolve, reject) => {
      this.data.getItemsByAuction_snapshot(this.auctionId).subscribe((itemsSnapList) => { 
        let itemObservableArray = [];
        itemsSnapList.forEach((snap) => {
          itemObservableArray.push(this.data.getItemLotNumberById(snap.key));
        });
       forkJoin(itemObservableArray).subscribe(lotNumbers => {
          let i = lotNumbers.length;
          while (i--) {
            if (lotNumbers[i] == control.value) {
              resolve({ dubNumber: true });
            }
          }
          resolve(null);
        });
      });
    });
   }

Работает как положено.

...