angular:使用来自多个可观察对象的结果的异步表单验证器出现问题
angular: trouble with an asynchronous form validator that uses results from multiple observables
我正在使用 angular 表单验证来尝试检查给定值是否已在一组数据中使用。
我正在构建的应用程序是一个在线拍卖平台,所以我有一个结构,其中 'Items' 属于 'Auctions',给定拍卖中的每个项目都应该有一个唯一的 "Lot Number." 它同样重要的是,用户能够手动分配批号,而不是自动分配的索引。
当卖家输入有关新商品的信息时,我想检查我的数据库 (Firebase) 以确定给定的批号是否已在给定的拍卖中使用。我正在尝试将此检查作为异步 angular 表单验证器执行。
我的代码是这样的:
注意:this.data
是我保留访问数据库的函数的服务的名称。他们 return observables。
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
return 是一个可观察对象,它提供属于拍卖的物品键列表。
然后我用每个键的可观察对象(returns 批号)填充一个数组,这样我就可以执行 forkJoin 并返回数组中使用的每个批号拍卖。
有了 forkjoin 的结果,我现在有了一个包含所有正在使用的批号的数组,我循环遍历它们以将每个批号与用户输入的值进行比较。
如果用户提供的值与已使用的值之一匹配,我希望验证器失败。但是,如果它是唯一的,则验证器应该读取为有效。
这与我希望的不一样。我怀疑我的错误在于我没有完全掌握 observables。任何帮助理解这里的错误将不胜感激。
我找到的解决方案是 return 一个新的承诺并将我的代码放入其中:
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);
});
});
});
}
它按预期工作。
我正在使用 angular 表单验证来尝试检查给定值是否已在一组数据中使用。
我正在构建的应用程序是一个在线拍卖平台,所以我有一个结构,其中 'Items' 属于 'Auctions',给定拍卖中的每个项目都应该有一个唯一的 "Lot Number." 它同样重要的是,用户能够手动分配批号,而不是自动分配的索引。
当卖家输入有关新商品的信息时,我想检查我的数据库 (Firebase) 以确定给定的批号是否已在给定的拍卖中使用。我正在尝试将此检查作为异步 angular 表单验证器执行。
我的代码是这样的:
注意:this.data
是我保留访问数据库的函数的服务的名称。他们 return observables。
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
return 是一个可观察对象,它提供属于拍卖的物品键列表。
然后我用每个键的可观察对象(returns 批号)填充一个数组,这样我就可以执行 forkJoin 并返回数组中使用的每个批号拍卖。
有了 forkjoin 的结果,我现在有了一个包含所有正在使用的批号的数组,我循环遍历它们以将每个批号与用户输入的值进行比较。
如果用户提供的值与已使用的值之一匹配,我希望验证器失败。但是,如果它是唯一的,则验证器应该读取为有效。
这与我希望的不一样。我怀疑我的错误在于我没有完全掌握 observables。任何帮助理解这里的错误将不胜感激。
我找到的解决方案是 return 一个新的承诺并将我的代码放入其中:
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);
});
});
});
}
它按预期工作。