angular - 你如何在 Angular 5 的自定义验证指令中使用多个参数?

标签 angular

例如,Angular 文档 here使用以下指令进行 forbiddenName 验证:

@Directive({
  selector: '[appForbiddenName]',
  providers: [{provide: NG_VALIDATORS, useExisting: ForbiddenValidatorDirective, multi: true}]
})
export class ForbiddenValidatorDirective implements Validator {
  @Input('appForbiddenName') forbiddenName: string;

  validate(control: AbstractControl): {[key: string]: any} {
    return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName, 'i'))(control)
                              : null;
  }
}

是否可以使用 Objectstring[] 的 @Input 而不是仅允许字符串?如果不是,如何传入多个参数?

Angular 文档在示例中这样使用它:

<input id="name" name="name" class="form-control"
       required minlength="4" appForbiddenName="bob"
       [(ngModel)]="hero.name" #name="ngModel" >

最佳答案

带分隔符的多个字符串

您可以传递带有分隔符的多个字符串。

比如我定义了一个范围验证器如下:

                    <input class="form-control" 
                            id="inputStarRating" 
                            type="text" 
                            placeholder="Rating"
                            mhRange="1,5"
                            [(ngModel)] = "movie.starRating"
                            name="starRating"
                            #starRatingVar = "ngModel" />

指令的代码如下:

  constructor(@Attribute('mhRange') range: string) {
    const arr = range.split(',');
    let min = 1;
    let max = 10;
    if (arr[0]) { min = parseInt(arr[0], 10); }
    if (arr[1]) { max = parseInt(arr[1], 10); }
    this.validator = NumberValidators.range(min, max);
  }

请注意,这使用拆分来分离两个不同的值。

数组

你也可以像这样传递数组:

  @Input('appForbiddenName') forbiddenName: string[];

  validate(control: AbstractControl): {[key: string]: any} {
    console.log(this.forbiddenName);
    return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName[0], 'i'))(control)
                              : null;
  }

注意:为了尽量减少对上述代码的更改,我只检查了第一个元素。但您可以将其更改为遍历数组。

HTML 看起来像这样:

    <input id="name" name="name" class="form-control"
           required minlength="4" [appForbiddenName]="powers"
           [(ngModel)]="hero.name" #name="ngModel" >

注意它如何使用绑定(bind)来绑定(bind)值数组。

对象

你可以这样定义对象:

  @Input('appForbiddenName') forbiddenName: Hero;

  validate(control: AbstractControl): {[key: string]: any} {
    console.log(this.forbiddenName);
    return this.forbiddenName ? forbiddenNameValidator(new RegExp(this.forbiddenName.alterEgo, 'i'))(control)
                              : null;
  }

假设定义了一个 Hero 类型。对于文档中的示例应用程序,我必须使用 any,因为没有定义 Hero 类型。

HTML 看起来像这样:

    <input id="name" name="name" class="form-control"
           required minlength="4" [appForbiddenName]="hero"
           [(ngModel)]="hero.name" #name="ngModel" >

Bottom line, you cannot pass anything but a string to the attribute, but that string can be a binding.

所以做这样的事情:

appForbiddenName='{"name":"Dr.", "alterEgo":"Dr. What", "power":"test"}'

只是将其作为字符串提供。您必须编写代码来解析它并将其转回对象:

  @Input('appForbiddenName') forbiddenName: string;

  validate(control: AbstractControl): {[key: string]: any} {
    const hero: Hero = JSON.parse(this.forbiddenName);
    console.log(hero.alterEgo);
    return this.forbiddenName ? forbiddenNameValidator(new RegExp(hero.alterEgo, 'i'))(control)
                              : null;
  }

关于angular - 你如何在 Angular 5 的自定义验证指令中使用多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060037/

相关文章:

angular - 如何在 Angular 5 中添加规范链接

angular - NgxMuiDatatables 无法使用 --aot 编译

javascript - 如何将 Angular 类名称从 component.ts 传递到 html SVG

angular - 如何更改 Angular Material 步进器中的状态图标?

angular - 我可以将 async/await Promises 与可观察的 RXJS 混合使用吗?

typescript - Angular2 - OnInit 未定义

json - 下拉列表无法从对象中提取数字值(Angular 4)

带有@Input装饰器的Angular 6 Karma测试子类

用于 react 形式的 Angular 6 lombok,有什么方法可以实现这种行为?

angular - 如何让api调用一对一而不是并发