Понимание статических методов внутри класса Validation в angular4
Я начинаю изучать управляемые моделями формы в угловых и когда я просматривал документацию управляемых моделями форм, я нашел это
component.ts
this.myForm= this.fb.group({
'contact':['',Validators.required]
});
Теперь, когда я пошел к определению класса валидатора, я нашел это
export declare class Validators {
...
static required(control: AbstractControl): ValidationErrors | null;
...
}
Это объясняет, что требуется статический метод в классе валидатора, и в качестве параметра требуется AbstractControl. но почему тогда мне разрешено использовать его без передачи каких-либо параметров внутри него.
1 ответ
Обязательный метод возвращает карту ошибок со свойством required: {'required':true}
если значение control: AbstractControl
пусто и null
если нет.
,
Из углового исходного кода: https://github.com/angular/angular/blob/6.1.9/packages/forms/src/validators.ts#L133-L154
static required(control: AbstractControl): ValidationErrors|null {
return isEmptyInputValue(control.value) ? {'required': true} : null;
}
,
Причина, по которой вы можете передать Validators.required без скобок и параметров, заключается в том, что Typescript - это расширенный набор Javascript, который может хранить функции в виде переменных:
var Foo = function (control: AbstractControl)
{
return anyVal;
};
Такой же как:
Foo(control: AbstractControl): any
{
return anyVal;
};
Таким образом, это полностью допустимо
var Bar = Foo;
А поскольку функция - это просто переменная, содержащая исполняемый код, мы можем сохранить функцию в нескольких переменных или передать ее в качестве параметра, что и делается в FormControl.
Так что в основном, когда вы делаете
const control = new FormControl('', Validators.required);
Вы не выполняете требуемый метод, потому что метод выполняется только при добавлении скобок и параметров. Вместо этого вы передаете саму функцию Validator.