주어진 사용자 이름이 이미 존재하는지 확인하는 반응 양식 제어를위한 비동기 유효성 검사기를 만들려고합니다. 다음은 비동기 유효성 검사기 코드입니다.
userdata.service.ts
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { FormControl } from '@angular/forms';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class UserdataService {
private apiUrl = 'http://apiurl.com/api'; // its not the real url, im just not posting it for privacy reasons
constructor(private http: HttpClient) {}
checkUsername(control: FormControl): Promise<any> | Observable<any> {
let isUsernameValid;
return new Promise<any>(
(resolve, reject) => {
this.http.get(this.apiUrl + '/users?name='+control.value).subscribe(
response => {
isUsernameValid = response;
});
if (isUsernameValid === 'false') {
resolve({'usernameIsInvalid': true})
} else {
resolve(null);
}
}
);
}
}
이 유효성 검사기를 시도하면이 오류가 발생합니다. "core.js : 4197 오류 유형 오류 : 정의되지 않은 'http'속성을 읽을 수 없습니다."
자, 나는 errr이 'this'를 사용하는 것과 관련이 있다고 생각하지만 왜 작동하지 않는지 이해할 수 없습니다 ... 그것은 나를 미치게 만들었 기 때문에 나는
console.log(this.apiUrl)
함수 내부, 약속 외부, 시도하기 위해 동일한 오류가 발생했습니다. "core.js : 4197 ERROR TypeError : Cannot read property 'apiUrl'of undefined"...
누군가 내가 뭘 잘못하고 있는지 설명해 주시고 해결 방법을 알려 주시면 감사하겠습니다.
편집하다:
아래와 같이 반응 형 ts 파일에서 내 서비스를 호출합니다.
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { CustomValidatorsService } from '../services/custom-validators.service';
import { LocationService } from '../services/location.service';
import { UserdataService } from '../services/userdata.service';
@Component({
selector: 'app-userdata-form',
templateUrl: './userdata-form.component.html',
styleUrls: ['./userdata-form.component.scss']
})
export class UserdataFormComponent implements OnInit {
userdataForm: FormGroup;
provinces: any = null;
provincesLoading = false;
cities: any = null;
citiesLoading = false;
constructor(
private locationService: LocationService,
private userdataService: UserdataService,
private customValidators: CustomValidatorsService,
private router: Router,
private route: ActivatedRoute
) { }
ngOnInit(): void {
this.formInit();
this.loadProvinces();
}
formInit() {
let dni: number = null;
let firstname: string = null;
let lastname: string = null;
let email: string = null;
let mobile: number = null;
let phone: number = null;
let birthdate: Date = null;
let username: string = null;
let password: string = null;
this.userdataForm = new FormGroup({
// ... a lot of controls before ...
'username': new FormControl(username, [
Validators.required,
Validators.minLength(3),
Validators.maxLength(30),
Validators.pattern(/^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s*[a-zA-ZÀ-ÿ\u00f1\u00d1]*)*[a-zA-ZÀ-ÿ\u00f1\u00d1]+$/)
], this.userdataService.checkUsername), // <-- here's the async validator
// ... form continues...
}
loadProvinces() {
this.provincesLoading = true;
this.locationService.getProvinces().subscribe(response => {
this.provinces = response;
this.provincesLoading = false;
});
}
- 답변 # 1
- 답변 # 2
이 기사에서와 같이 서비스 인스턴스를 인수로 가져 오는 유효성 검사기 함수를 만들어야한다고 생각합니다. https://medium.com/@tomaszsochacki/how-to-do-asynchronous-validator-in-angular-7-6e80243a874a
이와 같은 방법을 전달할 때
'username': new FormControl(username, [ Validators.required, Validators.minLength(3), Validators.maxLength(30), Validators.pattern(/^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s*[a-zA-ZÀ-ÿ\u00f1\u00d1]*)*[a-zA-ZÀ-ÿ\u00f1\u00d1]+$/) ], this.userdataService.checkUsername),
this
checkUsername 메소드의 컨텍스트가 누락되었습니다.또는 다음을 수행 할 수 있습니다.
'username': new FormControl(username, [ Validators.required, Validators.minLength(3), Validators.maxLength(30), Validators.pattern(/^[a-zA-ZÀ-ÿ\u00f1\u00d1]+(\s*[a-zA-ZÀ-ÿ\u00f1\u00d1]*)*[a-zA-ZÀ-ÿ\u00f1\u00d1]+$/) ], this.userdataService.checkUsername.bind(this.userdataService)),
첫 번째 인수에 바인딩이 호출되면 'this'컨텍스트를 메소드에 전달합니다.
관련 자료
- 오류 - 정의되지 않은 'nota'속성을 읽을 수 없습니다 (자바 스크립트)
- javascript - typeerror - 정의되지 않은 '상태'속성을 설정할 수 없습니다
- javascript - 수정 방법 정의되지 않은 속성 속성 '크기'를 읽을 수 없음
- javascript - typeerror - cannot read property 'name'of undefined (in create react app : appjs)
- typeerror - reactjs 양식 필드에서 정의되지 않은 '이름'속성을 읽을 수 없습니다
- react router - typeerror - 정의되지 않은 reactjs의 'push'속성을 읽을 수 없습니다
- javascript - 소행성 게임에 대해 정의되지 않은 속성 'x'를 읽을 수 없습니다
- typescript - typeerror - > serverresponsejson에서 정의되지 않은 속성 'get'을 읽을 수 없습니까?
- node.js - discordjs typeerror - 정의되지 않은 속성 '크기'를 읽을 수 없습니다
- node.js - pug - 정의되지 않은 'title'속성을 읽을 수 없습니다
- javascript - react componentdidmount - 정의되지 않은 속성을 읽을 수 없습니다-
- node.js - 정의되지 않은 속성 'slug'를 읽을 수 없지만 절대적으로 존재합니다
- javascript - typeerror - 알고리즘 거래에서 정의되지 않은 'then'속성을 읽을 수 없습니다
- loops - vue js는 정의되지 않은 속성을 읽을 수 없습니다
- javascript - typeerror - 정의되지 않은 '조건'속성을 읽을 수 없습니다
- angular - 오류 - usercomponent에서 정의되지 않은 'id'속성을 설정할 수 없습니다
- [karma server] TypeError Cannot read property 'range' of undefined - [karma-server] - typeerror : 정의되지 않은 '범위'
- javascript - discordjs - 정의되지 않은 "캐시"속성을 읽을 수 없습니다
- html - 정의되지 않은 '길이'속성을 읽을 수 없습니다자바 스크립트 오류
주석에서 언급했듯이 사용자 지정 유효성 검사기는 서비스가 아니어야합니다. 대신 클래스를
AsyncValidator
상호 작용:그런 다음 귀하의
<시간 /> 메모FormGroup
다음과 같이 :또한 RxJS의 파이프 가능 연산자를 사용하고 템플릿 리터럴을 사용하는 유효성 검사 논리를 수행하는 코드를 정리했습니다.)
면책 조항 : 위 코드가 실제로 작동하는지 테스트하지 않았습니다.
<시간 /> 자원Angular-양식 입력 유효성 검사>비동기 유효성 검사기 만들기
유효성 검사기 클래스를 FormControl 생성자에 전달할 수 있음 · 문제 # 24981 · 각도/각도