2016-06-14 3 views
1

У меня есть валидатор, который проверяет, является ли адрес электронной почты пользователей уникальным, для этого мне нужно также передать идентификатор пользователей, чтобы он не включал себя в уникальные проверки. Каков наилучший способ достичь этого?Передача дополнительного значения в пользовательский валидатор в 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); } 
      ) 
     }); 
    } 
} 

ответ

0

Я хотел бы использовать общую службу

@Injectable() 
class ValidatorParam { 
    value:string; // could also be an observable 
} 
@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, private _param:ValidatorParam) { } 

    validate(control: Control): Promise<ValidationResult> { 
     return new Promise((resolve, reject) => { 
      this._param.... // don't know what you want to do with it 
      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); } 
      ) 
     }); 
    } 
} 
@Component({ 
    selector: '...', 
    providers: [ValidatorParam], 
    template: ` 
<input #emailAddress="ngForm" type="text" [(ngModel)]="user.emailAddress" ngControl="emailAddress" required userExists /> 
`}) 
export class MyComponent { 
    constructor(private _validatorParam:ValidatorParam) { 
    this._validatorParam.value = xxx; 
    } 
} 

Таким образом, вы можете иметь только одну услугу на каждый компонент , Если у вас есть несколько элементов ввода в этом компоненте, им необходимо предоставить общий доступ к службе.

Осторожно: не пробовал себя.

+0

Есть ли преимущество для этого, чем путем добавления статической переменной в валидаторе для передачи дополнительного значения? – matthewrk

+0

Статическая переменная может изменить его для любого экземпляра вашего приложения. С помощью службы вы можете как минимум ограничить ее текущим компонентом (по крайней мере, это то, что я ожидаю от того, как он будет себя вести) –

+0

не работает для меня - не может найти имя «предоставить» – Tucker

Смежные вопросы