1
私はユーザーの電子メールアドレスが一意であるかどうかを確認するバリデーターを持っています。これを行うには、ユーザーIDも渡して、独自のチェックには含まれないようにする必要があります。これを達成する最良の方法は何ですか?Angular2でカスタムバリデーターに追加値を渡しますか?
バリデーターには、コントロール値にしかアクセスできないことがわかります。
<input #emailAddress="ngForm" type="text" [(ngModel)]="user.emailAddress" ngControl="emailAddress" required userExists />
現在、私はそれを達成することができました唯一の方法は理想的ではないバリ、上の静的な値を設定することである:私はこのように私のバリデータをフックしています!ここでバリデータのための私の完全なコードは次のとおりです。
import { NG_ASYNC_VALIDATORS, Control } from '@angular/common';
import { Directive, provide, forwardRef, Attribute } from '@angular/core';
import { UserService } from './user.service';
import { User } from './user.model';
interface ValidationResult {
[key: string]: boolean;
}
@Directive({
selector: '[userExists][ngModel]',
providers: [
provide(NG_ASYNC_VALIDATORS, {
useExisting: forwardRef(() => UserExistsValidator),
multi: true
})
]
})
export class UserExistsValidator {
public static user: User;
constructor(private _userService: UserService) { }
validate(control: Control): Promise<ValidationResult> {
return new Promise((resolve, reject) => {
this._userService.exists(control.value, UserExistsValidator.user.id).subscribe(
(response: any) => {
if (response.exists)
return resolve({ userExists: { valid: false } });
else
return resolve(null);
},
(error: any) => { console.log(error); }
)
});
}
}
バリデーションに静的変数を追加して追加値を渡すよりも、このようにする方が利点はありますか? – matthewrk
静的変数は、アプリケーションの任意のインスタンスに対して静的変数を変更します。サービスでは、少なくとも現在のコンポーネントに制限することができます(少なくともこれがどのように動作するのかはわかります) –
は私のためには機能しません - '提供'という名前を見つけることができません – Tucker