【发布时间】:2018-02-27 07:57:32
【问题描述】:
阅读 Angular 关于adding custom validators to template-driven forms的文档
— 有一个简单的示例,用于 custom 验证输入:
- 必填
- minlength="4"
- 值不应包含“bob”
标记:
<input id="name" name="name"
required minlength="4" appForbiddenName="bob"
[(ngModel)]="hero.name" #name="ngModel" >
指令:
@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} {
...
}
}
代码很清楚。 但是他们也在那里说:
您可能已经注意到自定义验证指令是 用
useExisting而不是useClass实例化。注册的 验证器必须是ForbiddenValidatorDirective的这个实例—— 表单中的实例,其forbiddenName属性绑定到“bob”。 如果你用useClass替换useExisting,那么你就是 注册一个新的类实例,一个没有forbiddenName.
现在——我知道useExistsing 和 useValue 之间有什么区别。
但是他们在谈论哪个现有实例?如果useExistsing 没有找到匹配项,它会创建一个...所以?
另外,注册一个新的类实例怎么会没有forbiddenName?它是其中的一个属性!
问题:
我不明白这里发生的操作顺序是什么。
谁在创建第一个实例以供以后使用 useExisting 的指令代码使用?
(如果我改用useClass,它将创建另一个不包含该属性的实例....(???))
【问题讨论】:
-
问题出在哪里?是否在单元测试中?
-
@ramesh 没有。我只是不明白哪个现有提供商已经拥有该物业,他们的意思是。我没有通过操作流程 pov 看到这里发生了什么
标签: javascript angular