HOHO - <KIOSK> 240404 유효성 검사 반응형양식(reactive forms)

chan_hari·2024년 7월 29일

HOHO-DIARY

목록 보기
44/56

챗 지피티 한테 회원가입 화면에 @input @outut을 써야 되냐고

그냥 폼 모듈을 써서 관리하는게 더 좋다고해서 폼을 더 공부를 해보려고 함

폼을 만들때

this.formGroup = this.formBuilder.group({
    toDo: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(30)]]
});
// FormBuilder를 사용하여 폼 그룹 생성
this.formBuilder.group({
  // email 폼 컨트롤 생성
  email: [
    // 초기값 설정
    '',
    // 유효성 검사 규칙 설정
    [Validators.required, Validators.email]
  ]

필드를 사용하여 유효성 검사상태 표시

<label for="toDo">
Add New To Do
<span
class="text-danger"
*ngIf="formGroup.get('toDo').errors &&
formGroup.get('toDo').hasError('required')"
>*</span>
</label>
  • <label for="toDo">: 이 라벨은 폼 컨트롤과 연결되는 라벨을 나타냅니다. 여기서 "toDo"는 폼 컨트롤의 이름이며, 해당 라벨은 해당 컨트롤과 연결됩니다.
  • Add New To Do: 라벨의 텍스트로, 사용자에게 이 폼 컨트롤이 어떤 용도로 사용되는지 설명합니다.
  • <span class="text-danger">: 이 스팬 요소는 에러 메시지를 표시하는 데 사용됩니다. 여기서 "text-danger" 클래스는 텍스트를 빨간색으로 변경하는 부트스트랩 클래스일 수 있습니다.
  • ngIf="formGroup.get('toDo').errors && formGroup.get('toDo').hasError('required')": 이 부분은 Angular의 조건 디렉티브인 ngIf를 사용하여 폼 컨트롤의 유효성을 확인합니다. formGroup.get('toDo').errors는 폼 컨트롤의 에러 객체를 나타내며, formGroup.get('toDo').hasError('required')는 해당 폼 컨트롤이 필수 필드인지 확인합니다. 즉, 폼 컨트롤에 필수 필드 유효성 검사 에러가 있는 경우에만 해당 스팬이 표시됩니다.

formGroup.get('toDo').errors && formGroup.get('toDo').hasError('required')

  1. formGroup.get('toDo').errors: 이 부분은 폼 그룹에서 toDo라는 이름의 폼 컨트롤에 대한 에러 객체를 가져옵니다. 만약 해당 폼 컨트롤에 에러가 있으면 이 에러 객체가 반환됩니다. 이 객체는 유효성 검사 에러의 종류와 그에 대한 추가 정보를 포함합니다.
  2. formGroup.get('toDo').hasError('required'): 이 부분은 폼 컨트롤에서 required라는 유효성 검사 규칙이 적용되었는지 여부를 확인합니다. 즉, 해당 폼 컨트롤이 필수 입력 필드인지를 검사합니다. 만약 해당 폼 컨트롤이 필수 입력 필드가 아니라면, 이 부분은 false를 반환합니다.

formGroup.get('toDo')

formGroup.get('toDo')는 Angular 폼 그룹에서 toDo라는 이름의 폼 컨트롤을 가져오는 메서드입니다.

폼 그룹은 폼 컨트롤을 관리하고 유효성을 검사하는 데 사용됩니다. get() 메서드를 사용하여 폼 그룹에서 특정 폼 컨트롤을 가져올 수 있습니다. 여기서 'toDo'는 해당 폼 컨트롤의 이름이며, 이 이름은 폼 컨트롤을 식별하는 데 사용됩니다.

이 메서드를 사용하여 폼 그룹에서 폼 컨트롤을 가져오면 해당 컨트롤을 직접 조작하거나 해당 컨트롤의 상태를 확인할 수 있습니다. 예를 들어, 폼 컨트롤의 값을 변경하거나 유효성을 확인하는 등의 작업을 수행할 수 있습니다.

.errors .hasError

.errors.hasError()는 Angular의 폼 컨트롤에서 유효성 검사 에러를 처리하는 메서드와 속성입니다.

  1. .errors: 이 속성은 폼 컨트롤에 대한 유효성 검사 에러를 나타내는 객체를 반환합니다. 만약 폼 컨트롤에 유효성 검사 에러가 없다면, 이 속성은 null을 반환합니다. 그러나 유효성 검사 에러가 있으면, 해당 에러를 설명하는 키-값 쌍으로 구성된 객체를 반환합니다. 예를 들어, 필드가 필수 입력 필드이고 사용자가 값을 입력하지 않은 경우, { 'required': true }와 같은 객체가 반환됩니다.
  2. .hasError(): 이 메서드는 폼 컨트롤에 특정 유효성 검사 에러가 있는지 확인합니다. 메서드의 인자로는 검사하려는 에러 유형을 전달합니다. 예를 들어, .hasError('required')는 폼 컨트롤에 필수 입력 필드 에러가 있는지를 확인합니다. 만약 해당 에러가 있으면 참(true)을 반환하고, 없으면 거짓(false)을 반환합니다.

&&

&&는 논리 연산자 중 하나로, 두 개의 표현식이 모두 참일 때 전체 표현식이 참이 되는 것을 나타냅니다. 이 연산자는 AND 연산을 수행합니다.

예를 들어, A && B라는 표현식에서 AB는 각각 불리언(boolean) 값을 갖는 표현식입니다. 이때, AB가 모두 참(true)일 경우 전체 표현식이 참(true)이 되고, 그렇지 않으면 전체 표현식이 거짓(false)이 됩니다.

논리 연산자 &&는 일반적으로 조건문에서 두 가지 조건을 모두 충족해야 하는 경우에 사용됩니다

각 유효성 검사 오류 메시지 표시

<input
    id="toDo"
    type="text"
    class="form-control"
    placeholder="What is it you want to do?"
    formControlName="toDo"
    [class.valid]="formGroup.get('toDo').valid &&
        (formGroup.get('toDo').dirty || formGroup.get('toDo').touched)"
    [class.invalid]="formGroup.get('toDo').invalid &&
        (formGroup.get('toDo').dirty || formGroup.get('toDo').touched)" />
  • formControlName="toDo": 이 속성은 폼 컨트롤의 이름을 지정합니다. Angular에서 폼 컨트롤을 사용할 때 해당 이름을 사용하여 컨트롤을 식별합니다.
  • [class.valid][class.invalid]: 이 부분은 폼 컨트롤의 유효성 상태에 따라 클래스를 동적으로 설정합니다. [class.valid]는 유효한 상태일 때, [class.invalid]는 유효하지 않은 상태일 때 클래스를 설정합니다.
  • formGroup.get('toDo').valid, formGroup.get('toDo').invalid: 폼 컨트롤의 validinvalid 속성은 각각 해당 컨트롤이 유효한지 또는 유효하지 않은지를 나타냅니다.
  • (formGroup.get('toDo').dirty || formGroup.get('toDo').touched): 이 부분은 폼 컨트롤이 사용자에 의해 수정되었거나 터치되었는지를 확인합니다. dirty 속성은 사용자에 의해 값이 변경되었을 때 참(true)이며, touched 속성은 사용자가 해당 필드에 포커스를 주었을 때 참(true)입니다. 이 두 속성 중 하나라도 참일 경우 해당 입력 필드는 수정되었다고 판단됩니다.

이렇게 함으로써 사용자의 입력 상태에 따라 입력 필드의 스타일을 동적으로 변경할 수 있습니다. 유효한 입력일 경우에는 보다 친숙한 스타일을 적용하고, 유효하지 않은 입력일 경우에는 사용자에게 주의를 줄 수 있습니다.

[class.valid]="formGroup.get('toDo').valid &&
(formGroup.get('toDo').dirty || formGroup.get('toDo').touched)

[class.valid]는 Angular의 클래스 바인딩을 사용하여 요소에 클래스를 동적으로 추가하는 방법입니다. 이것은 폼 컨트롤의 유효성 및 상호 작용 상태에 따라 클래스를 추가하는 데 사용됩니다.

formGroup.get('toDo').valid는 폼 컨트롤의 유효성을 나타내며, 폼 컨트롤이 유효한 경우에만 이 클래스가 추가됩니다.

(formGroup.get('toDo').dirty || formGroup.get('toDo').touched)는 폼 컨트롤이 수정되었거나 사용자가 터치했는지 여부를 나타냅니다. 즉, 사용자의 상호 작용 여부를 확인합니다. 폼 컨트롤이 수정되었거나 사용자가 터치했을 때에만 이 클래스가 추가됩니다.

따라서 [class.valid]는 폼 컨트롤이 유효하고 사용자가 해당 필드에 상호 작용한 경우에만 클래스를 추가합니다. 이것은 일반적으로 유효한 입력을 강조하거나, 사용자가 올바른 입력을 하였음을 시각적으로 나타내기 위해 사용됩니다.

💥💥💥💥💥

이건 앵귤러 17버전이 아닌것 같음

종원님꺼 form 찾아보았음

ngoninit()을 사용하셔서 formgroup 생성하시고 거기 안에 조건이랑 다 넣으셨음

ngOnInit(): void {
    const id = this.route.snapshot.paramMap.get('id');

    if (!id) {
      this.formGroup = this.fb.nonNullable.group({
        title: ['', [Validators.required]],
        content: ['', Validators.required],
      });
    } else {
      this.mode = 'edit';

      this.todo = this.todoService.getTodo(id);

      if (!this.todo) {
        this.router.navigateByUrl('');
      }

      this.formGroup = this.fb.nonNullable.group({
        title: [this.todo?.title, Validators.required],
        content: [this.todo?.content, Validators.required],
      });
    }
  }

>>ngOnInit()은 뭐냐?

ngOnInit() 메서드는 Angular 컴포넌트의 생명주기 훅 중 하나입니다. 이 메서드는 컴포넌트가 생성되고 초기화된 직후에 호출되는 시점에 실행됩니다.

일반적으로 ngOnInit() 메서드에서는 컴포넌트 초기화에 필요한 작업들이 수행됩니다. 주로 다음과 같은 작업들이 ngOnInit() 메서드에서 수행됩니다:

  1. 초기 데이터 로드: 컴포넌트가 초기화될 때 필요한 데이터를 가져와서 초기화합니다.
  2. 서비스 호출: 컴포넌트가 초기화될 때 필요한 서비스를 호출하여 데이터를 가져옵니다.
  3. 초기화된 폼 설정: 컴포넌트에 있는 폼 컨트롤을 초기값으로 설정하거나 유효성 검사를 설정합니다.
  4. 초기화된 변수 설정: 컴포넌트 클래스의 변수들을 초기값으로 설정합니다.
  5. 구독 설정: Observable을 구독하거나 이벤트 리스너를 등록합니다.

ngOnInit() 메서드는 주로 초기화 로직을 담당하기 때문에 컴포넌트 클래스에서 가장 일반적으로 사용되는 메서드 중 하나입니다.

예시:

typescriptCopy code
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-my-component',
  templateUrl: './my-component.component.html',
  styleUrls: ['./my-component.component.css']
})
export class MyComponentComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
    // 컴포넌트 초기화에 필요한 작업 수행
    console.log('Component initialized');
  }

}

>>그럼 비밀번호 유효성검사때 ngOnInit을 써야돼?

ngoninint을 초기화된 폼 설정때 사용한다는 것을 보았음

그럼 비밀번호 유효성 검사 폼이 계속 초기화가 왜 되는 거지 라는 의문이 듦

💡 그럼 회원가입 페이지에서 비밀번호 유효성 검사를 하려고 하는데 formgroup 만들어서 formbuilder 해서 하려고 해 입력값으로 유효성을 검사하니까 폼 그룹을 초기화 해야되나? 그럼 ngoninit을 써야 돼?

일반적으로 회원가입 페이지와 같은 폼에서 비밀번호 유효성을 검사하기 위해 폼 그룹을 만들고 formBuilder를 사용하여 설정할 때, ngOnInit() 메서드 내에서 이를 수행하는 것이 일반적입니다.

이렇게 함으로써 컴포넌트가 초기화될 때 폼 그룹이 적절하게 설정되고 초기화되며, 폼이 렌더링될 때 즉시 사용자의 입력에 대한 유효성을 검사할 수 있습니다.

따라서 회원가입 페이지에서 비밀번호 유효성을 검사하는 경우에는 보통 ngOnInit() 메서드 내에서 폼 그룹을 초기화하고 설정하는 것이 적절합니다. 이렇게 함으로써 초기화 작업을 명확하고 일관된 방식으로 수행할 수 있습니다.

폼 그룹을 형성 하려면

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css']
})
export class LoginComponent {

loginForm: FormGroup;

constructor(private formBuilder: FormBuilder) {
this.loginForm = this.formBuilder.group({
// 폼 컨트롤들 정의
});
}

// 나머지 컴포넌트 로직
}
this.formGroup = this.fb.nonNullable.group({
        title: [this.todo?.title, Validators.required],
        content: [this.todo?.content, Validators.required],
      });

onSubmit()은 앵귤러에서 폼이 제출될때 호출되는 메서드이다.

이 메서든는 보통 폼의 유효성을 확인하고 데이터를 처리하는 데 사용됨

  1. 폼의 유효성 검사: 사용자가 제출한 데이터가 유효한지 확인합니다. 이는 Angular의 폼 유효성 검사 기능을 사용하여 수행됩니다.
  2. 데이터 처리: 유효성 검사를 통과한 경우, 제출된 데이터를 처리하거나 저장합니다. 이는 일반적으로 서버로 데이터를 전송하거나 클라이언트 측에서 처리하는 작업을 포함합니다.
  3. 추가적인 작업 수행: 폼 제출 후에 필요한 추가 작업을 수행합니다. 예를 들어, 사용자에게 성공적으로 제출되었다는 메시지를 표시하거나 화면을 다시로드할 수 있습니다.

일반적으로 폼이 제출될 때 호출되는 이벤트 핸들러로 onSubmit() 메서드가 사용됩니다. 이 메서드는 Angular 컴포넌트 클래스에서 정의되며, 템플릿에서 폼의 ngSubmit 디렉티브와 바인딩되어 폼의 제출 이벤트에 응답합니다.

onSubmit() 메서드에서는 폼의 유효성을 검사하고 필요에 따라 특정 동작을 수행해야 합니다. 그러나 제공된 코드에는 문법 오류와 로직 오류가 있습니다.

수정된 onSubmit() 메서드는 다음과 같습니다.

typescriptCopy code
onSubmit() {
  if (this.formGroup.invalid) {
    // 폼이 유효하지 않은 경우에 실행되는 로직을 여기에 추가합니다.
    console.log('폼이 유효하지 않습니다.');
  } else {
    // 폼이 유효한 경우에 실행되는 로직을 여기에 추가합니다.
    console.log('폼이 유효합니다.');
  }
}

위의 코드에서는 먼저 if 문을 사용하여 폼의 유효성을 검사합니다. 폼이 유효하지 않은 경우에는 적절한 로직을 실행할 수 있습니다. 예를 들어 로그를 출력하거나 사용자에게 메시지를 표시할 수 있습니다.

폼이 유효한 경우에는 else 블록에서 추가적인 로직을 실행할 수 있습니다. 이 로직은 폼이 유효한 경우에만 실행됩니다. 따라서 폼이 유효한 경우에 필요한 동작을 이곳에 추가하면 됩니다.

위의 코드는 폼의 유효성을 검사하고 그 결과에 따라 적절한 동작을 수행하는 기본적인 방법을 보여줍니다. 실제로 필요한 동작에 따라 코드를 수정하십시오.

>> 각 유효성 검사 오류메시지 표시

<input
id="toDo"
type="text"
class="form-control"
placeholder="What is it you want to do?"
formControlName="toDo"
[ngClass]="{
'valid': formGroup.get('toDo').valid && (formGroup.get('toDo').dirty || formGroup.get('toDo').touched),
'invalid': formGroup.get('toDo').invalid && (formGroup.get('toDo').dirty || formGroup.get('toDo').touched)
}" />

ngClass를 사용한 동적 클래스 바인딩:

  • [ngClass]="{ ... }": 특정 조건에 따라 input 요소에 CSS 클래스를 동적으로 추가하거나 제거할 수 있는 지시문입니다.
  • 중괄호 안에 키-값 쌍으로 구성된 객체를 정의합니다.
    • 키는 적용될 CSS 클래스 이름을 나타냅니다.
    • 값은 true 또는 false로 평가되는 표현식입니다.
      • 'valid': 다음 조건이 true라면 이 클래스가 적용됩니다.
        • formGroup.get('toDo').valid: "toDo" FormControl이 유효한지 (오류가 없는지) 확인합니다.
        • &&: 논리적 AND 연산자. 클래스가 적용되려면 앞뒤 두 조건 모두 true여야 합니다.
        • (formGroup.get('toDo').dirty || formGroup.get('toDo').touched): "toDo" FormControl이 dirty (사용자에 의해 수정됨) 또는 touched (사용자가 상호 작용함)인지 확인합니다.
      • 'invalid': 다음 조건이 true라면 이 클래스가 적용됩니다.
        • formGroup.get('toDo').invalid: "toDo" FormControl이 유효하지 않은지 (오류가 있는지) 확인합니다.
        • &&: 논리적 AND 연산자.
        • (formGroup.get('toDo').dirty || formGroup.get('toDo').touched): 'valid' 클래스와 동일한 조건입니다.

결론:

이 코드는 사용자가 "할 일" 항목을 입력할 수 있는 input 필드를 생성합니다. formControlName을 사용하여 Angular 반응형 폼과 통합하고, dirtytouched 상태와 유효성에 따라 ngClass를 사용하여 CSS 클래스를 동적으로 적용합니다. 이를 통해 사용자에게 input 필드의 상태 (유효, 유효하지 않음, 상호 작용 여부)를 시각적으로 나타낼 수 있습니다.

0개의 댓글