2017-12-03 6 views
1

AngularFire 데이터베이스에서 비동기 적으로 업데이트되는 양식 필드에서 "필수"유효성 검사기가 작동하지 않아서 문제가 발생했습니다. 기존 사용자를 편집하려고 할 때 "username"과 "email"입력에 모두 기존 사용자의 값이 포함되어 있어도 Angular는 입력 할 때까지 각 <input>을 비워 둘 것 같습니다. 각각 <input>을 입력 할 때까지 제출 단추가 비활성화되어 있기 때문에이 동작을 볼 수 있습니다.필수 유효성 검사기가 비동기 필드와 함께 작동하지 않음

는 여기에 내가 더 각도가에서 다음 탭을 필드 중 하나에 내 <input>의 비어 있기 때문에 만약 내가 탭을보고 확인할 수 있습니다 여기에 내보기

<form [formGroup]="form" (ngSubmit)="submit()"> 
    <div class="form-group"> 
     <label for="username">Username</label> 
     <input [(ngModel)]="user.username" type="text" class="form-control" formControlName="username" value={{(item|async)?.name}}> 
     <div *ngIf="form.controls.username.touched && !form.controls.username.valid" class="alert alert-danger"> 
      Username is required 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="email">Email</label> 
     <input [(ngModel)]="user.email" type="text" class="form-control" formControlName="email" value={{(item|async)?.email}}> 
     <div *ngIf="form.controls.email.touched && !form.controls.email.valid" class="alert alert-danger"> 
      Email is required 
     </div> 
    </div> 
    <button [disabled]="!form.valid" class="btn btn-primary" type="submit">Submit</button> 
</form> 

의 내 구성 요소

import { Component } from '@angular/core'; 
import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; 
import { Router, ActivatedRoute } from '@angular/router'; 
import { AngularFireDatabase } from 'angularfire2/database'; 

import { User } from './user'; 

@Component({ 
    selector: 'user-form', 
    templateUrl: 'user-form.component.html' 
}) 
export class UserFormComponent { 
    key; 
    item; 
    form: FormGroup; 
    user = new User(); 

    constructor(fb: FormBuilder, private _router: Router, private _route:ActivatedRoute, private db: AngularFireDatabase) { 
     this.form = fb.group({ 
      username: ['', Validators.required], 
      email: ['', Validators.required] 
     }) 
    }; 

    ngOnInit() { 
     this._route.params.subscribe(params => { 
      this.key = params["key"]; 
     }) 

     if (!this.key) { 
      this.title = "New User"; 
     } 
     else { 
      // This is the path that is followed for editing an existing user 
      this.title = "Edit User"; 
      this.item = this.db.object(this.key).valueChanges(); 
     } 
    } 
} 

입니다 아무 것도 입력하지 않으면 오류 메시지를 표시하는 <div>이 나타납니다.

기존 사용자를 편집 할 때 Angular가 내 <input> 둘 모두를 비어있는 것으로 생각하는 이유는 무엇입니까? async 파이프를 사용하고 있기 때문에 "필수"유효성 검사기를 처리해야하는 다른 방법이 있습니까?

+0

당신이 AsyncValidator를 사용하는 것을 고려 했는가를? – zakirulq

+0

나는 validator를'this.form = fb.group ({username : [ '', {asyncValidator : Validators.required}]와 같이 AsyncValidator로 변경했다. 이메일 : [ '', {asyncValidator : Validators.required}}) ,하지만'submit '메소드에서' '컨트롤에 값을 입력하지 않으면'this.user.username'과'this.user.email'가'undefined'라는 문제가 있습니다. 두 입력 모두 웹 페이지에서 시각적으로 값을 가지고 있습니다. –

답변

0

콘솔에 오류가 가득해야합니다. FormGroup 내에서 ngModel을 사용할 수 없습니다. 템플릿 기반 양식 (FormsModule) 또는 모델 기반 양식 (ReactiveFormsModule)을 사용하지만 둘 다 서로 사용할 수는 없습니다.

ngModel 및 값 항목을 제거하십시오. ReactiveFormsModule를 사용할 때 폼의 값을 설정하려면 방법 setValue() 또는 patchValue() 사용

this.form.setValue({ 
    username: 'example', 
    email: '[email protected]' 
}); 

또는 단일 FormControl 값을 설정할 수 있습니다

this.form.get('username').setValue('example') 
+0

"FormGroup 내에서 ngModel을 사용할 수 없습니다. 왜 허용되지 않습니까? 추천하지는 않지만 사용할 수 있습니다. – Alex

+0

각도는 글자 그대로 오류를 발생시킵니다. – Christian

+0

아니야 그렇지 않아 : https://stackblitz.com/edit/angular-vcmvmc?file=app/app.component.ts – Alex