FormGroup получает значение поля: TypeError: невозможно прочитать свойство «получить» неопределенного

Я пытаюсь проверить поле "passwordConfirm", но получаю странную ошибку: ERROR TypeError: Cannot read property 'get' of undefined вот мой код:

loginForm: FormGroup;


ngOnInit(){
    this.loginForm = new FormGroup({
      'email': new FormControl(null, [Validators.required, Validators.email]),
      'password': new FormControl(null, Validators.required),
      'passwordConfirm': new FormControl(null, [Validators.required, this.checkIfMatchingPasswords.bind(this)]),
    });
}



checkIfMatchingPasswords() {
    return this.loginForm.get('password').value === this.loginForm.get('passwordConfirm').value ? null : { notSame: true} // error
  }

person sandum    schedule 11.08.2017    source источник
comment
Попробуйте if(!this.loginForm) {return null} в своем пользовательском валидаторе.   -  person AJT82    schedule 11.08.2017
comment
Ничего не произошло.   -  person sandum    schedule 11.08.2017
comment
очень странно, но вы можете попробовать this.loginForm.controls['controlname'].value   -  person Jorawar Singh    schedule 11.08.2017
comment
в области checkIfMatchingPasswords() this.loginForm не определен   -  person sandum    schedule 11.08.2017
comment
теперь я понимаю, что это не валидатор, а чистая функция. я думаю, вам нужно сделать что-то еще, например, вызвать эту функцию при изменении значения при подтверждении пароля или отправке вместо проверки.   -  person Jorawar Singh    schedule 11.08.2017
comment
Все, что мне нужно, это валидатор для сопоставления паролей   -  person sandum    schedule 11.08.2017
comment
проверьте эту ссылку для валидаторов на основе шаблона и на основе данных   -  person Rahul Singh    schedule 11.08.2017
comment
Вы добавили [formGroup]="loginForm" в свой html?   -  person Emon    schedule 21.08.2018


Ответы (2)


То, чего вы пытаетесь достичь, привязывая this к вашему валидатору, вероятно, терпит неудачу, поскольку несколько функций валидатора объединены в одну функцию, где контекст, вероятно, отличается.

Однако, если вы следуете по следу функции валидатора, вы можете сделать следующее:

checkIfMatchingPasswords(control: AbstractControl): ValidationErrors | null {
    return control.root.get('password').value === control.value ? null : { notSame: true };
}

Хитрость в том, что каждый AbstractControl знает своего родителя и root.

person PerfectPixel    schedule 11.08.2017

Решение состоит в том, чтобы проверить, существует ли форма входа в систему. Если я делаю console.log из this.loginForm, он выполняется три раза. Первый раз не определено и вызывало ошибку. Я не знаю, почему это происходит, может быть, это зацепки жизненного цикла Angular.

  checkIfMatchingPasswords() {
    if (this.loginForm) {
      return this.loginForm.get('password').value === this.loginForm.get('passwordConfirm').value ? null : {notSame: true};
    }
  }
person sandum    schedule 11.08.2017
comment
Ну, это в основном то, что я сказал, но вместо if(this.loginForm) я сказал if(!this.loginForm) { return null } ....rest of code here... Но любой из этих способов работает. - person AJT82; 11.08.2017
comment
Вам просто нужно помнить, что с этим решением оно проверяется только при изменении passwordConfirm :) - person AJT82; 11.08.2017