Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在angular 4中显示来自自定义验证器函数的自定义错误消息? 请考虑下面的自定义验证器函数,该函数调用后端的API来获取一些数据,检查它们是否与当前表单输入有关,如果当前表单输入为重复值:,则返回错误。 //check to see if the new category name entered is already in the system categoryNameUnique(c: FormControl) { let categoryNameAlreadyExists: boolean = false; //get list of current categories from the server. return this.inventoryCategoryService.getAll().map(items => { for (let item of items) { if (item.Name == c.value) { categoryNameAlreadyExists = true; break; } } if (categoryNameAlreadyExists) { //name is not unique return { categoryNameUnique: false } } //not a duplicate, all good return null; }); }_Javascript_Angular_Validation_Typescript - Fatal编程技术网

Javascript 如何在angular 4中显示来自自定义验证器函数的自定义错误消息? 请考虑下面的自定义验证器函数,该函数调用后端的API来获取一些数据,检查它们是否与当前表单输入有关,如果当前表单输入为重复值:,则返回错误。 //check to see if the new category name entered is already in the system categoryNameUnique(c: FormControl) { let categoryNameAlreadyExists: boolean = false; //get list of current categories from the server. return this.inventoryCategoryService.getAll().map(items => { for (let item of items) { if (item.Name == c.value) { categoryNameAlreadyExists = true; break; } } if (categoryNameAlreadyExists) { //name is not unique return { categoryNameUnique: false } } //not a duplicate, all good return null; }); }

Javascript 如何在angular 4中显示来自自定义验证器函数的自定义错误消息? 请考虑下面的自定义验证器函数,该函数调用后端的API来获取一些数据,检查它们是否与当前表单输入有关,如果当前表单输入为重复值:,则返回错误。 //check to see if the new category name entered is already in the system categoryNameUnique(c: FormControl) { let categoryNameAlreadyExists: boolean = false; //get list of current categories from the server. return this.inventoryCategoryService.getAll().map(items => { for (let item of items) { if (item.Name == c.value) { categoryNameAlreadyExists = true; break; } } if (categoryNameAlreadyExists) { //name is not unique return { categoryNameUnique: false } } //not a duplicate, all good return null; }); },javascript,angular,validation,typescript,Javascript,Angular,Validation,Typescript,您将看到这个函数返回一个可观察的(因为我必须返回后端服务器获取一些数据来进行验证)。验证器就像一个符咒,没有问题。但是,当这个验证器在我相应的HTML视图中无效时,我不知道如何向用户显示适当的消息。如果这个函数没有返回一个可观察的值,我会这样做: <div *ngIf="form.controls['categoryName'].errors?.categoryNameUnique"> This category name is already taken </div&

您将看到这个函数返回一个可观察的(因为我必须返回后端服务器获取一些数据来进行验证)。验证器就像一个符咒,没有问题。但是,当这个验证器在我相应的HTML视图中无效时,我不知道如何向用户显示适当的消息。如果这个函数没有返回一个可观察的值,我会这样做:

<div *ngIf="form.controls['categoryName'].errors?.categoryNameUnique">
    This category name is already taken
</div>
必需的minLength和maxLength验证器是synchronus,但我的自定义验证器categoryNameUnique是异步的,因此应该单独编写。我将设置更改为以下内容,现在一切正常:

constructor(private fb: FormBuilder, private router: Router, private inventoryCategoryService: InventoryCategoryService) {
    this.form = fb.group({
        'categoryName': [null, Validators.compose([Validators.required, Validators.minLength(3), Validators.maxLength(50)]),
            Validators.composeAsync([this.categoryNameUnique.bind(this)])]
    });
}

我认为您的问题可能是如何将异步验证器应用于控件。根据您对
form.controls.categoryName
的使用情况,我假设您正在使用formbuilder创建表单。在这种情况下,您需要提供异步验证器作为组params数组中的第三个参数,如下所示:

this.form = this.formBuilder.group({
  categoryName: ["", [], [categoryNameUnique]]
});
<div *ngIf="form.controls.categoryName.hasError('categoryNameUnique')">
    The category name is not unique!
</div>
这样设置之后,您应该能够在错误中看到它

显示自定义验证错误的首选方式如下:

this.form = this.formBuilder.group({
  categoryName: ["", [], [categoryNameUnique]]
});
<div *ngIf="form.controls.categoryName.hasError('categoryNameUnique')">
    The category name is not unique!
</div>

类别名称不唯一!

这个
应该可以正常工作,它对您有什么影响?@Maximus,categoryNameUnique不会出现在我的错误对象中。相反,errors对象包含可观察的属性:
操作符
。如果我检查这两个属性,它不会显示任何与我从observable中传回的categoryNameUnique自定义错误对象相关的内容。奇怪,你能设置一个plunker吗?还有,你的
验证
方法看起来如何?谢谢@Maximus,我已经更新了我的原始帖子,描述了问题是什么以及我是如何解决的。谢谢@Dhraz。。。你回答了,我自己想出来的。无论如何,我感谢你的帮助,并将你的回答标记为正确答案。没问题,我希望它能帮助其他有同样问题的人。