angular:使用异步表单验证器的麻烦,该验证程序使用来自多个可观察对象的结果

时间:2018-04-24 22:17:12

标签: angular rxjs angular2-formbuilder

我正在使用角度表单验证来尝试检查给定值是否已在一组数据中使用。

我正在构建的应用程序是一个在线拍卖平台,所以我有一个结构,其中'项目'属于'拍卖'并且特定拍卖中的每个项目都应该有一个唯一的"批号。"用户能够手动分配批号而不是自动分配的索引也很重要。

当卖家输入有关新物品的信息时,我想对我的数据库(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返回一个observable,它提供属于拍卖的项目键列表。

然后,我为每个键填充一个带有observable(返回批号)的数组,这样我就可以进行forkJoin并获得拍卖中使用的每个批号的数组。

使用forkjoin的结果我现在有一个正在使用的所有批号的数组,我循环遍历它们以将每个数字与用户输入的值进行比较。

如果用户提供的值与已使用的值之一匹配,我希望验证器失败。但是,如果它是唯一的,则验证器应该读为有效。

这并不像我希望的那样。我怀疑我的错误在于我没有完全掌握可观察物。任何帮助理解这里的错误将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到的解决方案是返回一个新的承诺并将我的代码放在其中:

  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);
        });
      });
    });
   }

它按预期工作。