2017-09-15 5 views
0

각형으로 동적 폼을 만들려고합니다. 각 필드는 독립 구성 요소를 사용하며 유효성 검사기 목록을 포함하여 구성 데이터를 전달해야합니다 , 모든 사전 설정된 서버 측.폼 구성 요소에 미리 정의 된 유효성 검사기 배열 배열을 전달합니다.

나는 유효성 검사를 설정하는 데 어려움을 겪고 있습니다. 예를 들어,이 있습니다

ngOnInit(){ 

this.detailsForm = this.formBuilder.group({ 
    exampleField: ['', Validators.compose([ 
    Validators.required, 
    Validators.maxLength(32), 
    Validators.minLength(10) 
    ])] 
}); 
} 

대신 '하드 코딩'이처럼 내 구성 요소에 유효성 검사기, 어떻게 구성 객체, 즉 뭔가 같은에서 그들을 설정할 수 있습니다

fieldData = { 
    exampleField: { 
    value: 'default value!', 
    validators: ['required', 'minLength:10'] 
    } 
} 

편집 :

당신의 대답에 감사드립니다.

fieldData = { 
    exampleField: { 
    value: 'default value!', 
    validators: { 
    required: true, 
    minLength: 10, 
    pattern: /I_NEED_PATTERN_CHECK/, 
    minLength: null 
    } 
    } 
} 

그 다음에 당신은 약간 이런 일에 설정 객체를 수정하는 경우

import { Component, Input, Output, EventEmitter, Injector, OnInit } from '@angular/core'; 
import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms'; 
import { EntryService } from '../../_services/entry.service'; 

@Component({ 
    selector: 'app-text-input', 
    templateUrl: './text-input.component.html', 
    styleUrls: ['./text-input.component.scss'] 
}) 
export class TextInputComponent implements OnInit { 

    @Input() id: number; 
    @Input() field_name: string; 
    @Input() label: string; 
    @Input() value: string; 

    public fieldData; 
    public detailsForm: FormGroup; 

    constructor(
     private injector: Injector, 
     public _entryService: EntryService, 
     private formBuilder: FormBuilder, 
    ) { 
    this.id = this.injector.get('id'); 
    this.field_name = this.injector.get('field_name'); 
    this.label = this.injector.get('label'); 
    this.value = this.injector.get('value'); 
    } 

    populateValidatorsList(valObj): any[] { 
    const list = []; 
    if (valObj['pattern']) { list.push(Validators.pattern(valObj['pattern'])); } 
    if (valObj['maxLength']) { list.push(Validators.maxLength(valObj['maxLength'])); } 
    if (valObj['minLength']) { list.push(Validators.minLength(valObj['minLength'])); } 
    if (valObj['required']) { list.push(Validators.required); } 
    return list; 
    } 

    ngOnInit(){ 

    this.fieldData = { 
     exampleField: { 
     value: 'default value!', 
     validators: { 
      required: true, 
      minLength: 10, 
      pattern: /I_NEED_PATTERN_CHECK/, 
      maxLength: null 
     } 
     } 
    } 

    this.detailsForm = this.formBuilder.group({ 
     exampleField: [this.fieldData['exampleField']['value'], this.populateValidatorsList()] 
    // exampleField: [this.fieldData['exampleField']['value'], [...this.populateValidatorsList()]] // BOTH OF THESE ALSO 
    // exampleField: [this.fieldData['exampleField']['value'], [this.populateValidatorsList()]]  // PRODUCE THE SAME ERROR! 
    }); 

} 
+0

예상 된 형식으로 필드 데이터를 반환하는 라우팅을 작성하십시오. –

답변

1

: 토론 후, 여기에 여전히 불행하게도 오류 Supplied parameters do not match any signature of call target.을 생산하고 내 구성 요소의 전체 코드입니다 구성 요소에는이 validators 등록 정보를 처리하는 메소드가 있습니다.

populateValidatorsList(valObj): any[] { 
const list = []; 
if (valObj['pattern']) { list.push(Validators.pattern(valObj['pattern'])); } 
if (valObj['maxLength']) { list.push(Validators.maxLength(valObj['maxLength'])); } 
if (valObj['minLength']) { list.push(Validators.minLength(valObj['minLength'])); } 
if (valObj['required']) { list.push(Validators.required); } 
return list; 
} 

ngOnInit() { 
this.detailsForm = this.formBuilder.group({ 
    exampleField: [this.fieldData['exampleField']['value'], [...this.populateValidatorsList(this.fieldData['exampleField']['validators'])]] 
}); 
} 

이 방법으로 맞춤 검증을 추가 할 수도 있습니다. 다른 .ts 파일 (예 : validations.ts)을 만들고 모든 사용자 정의 유효성 검사 functions을 포함 시키십시오. class이 아니며 사용자 지정 유효성 검사 함수 rules을 따라 그룹화 된 export ed 함수 집합 만 그룹화됩니다. 그럼 당신은 같은 config.validators의 다른 재산

validators: { 
required: true, 
minLength: 10, 
pattern: /I_NEED_PATTERN_CHECK/, 
minLength: null, 
custVal: 'custCheckForFoo' 
} 

validators.ts

export function custCheckForFoo(c: AbstractControl) { 
// validation check 
// return null or errors object 
} 

가져 오기 등의 구성 요소에서이 기능을

import * as fromValidators from '../validators' 

는 추가 검사로 populateValidatorsList()에 사용을 할 수 있습니다 ,

if (valObj['custVal']) { list.push(fromValidators[valObj['custVal']]); } 
+0

감사합니다. Amal. 이것은 꽤 좋다! * if * 꽤 이상적이지 않습니다. 왜냐하면 저는 여전히 유효성 검사기 이름을 if 문으로 구성 요소에 하드 코딩해야하기 때문입니다. 나는 그것과 함께 살 수 있다고 생각하지만 그 주위에 어떤 방법이 있는지 궁금해 ..? – Inigo

+0

당신은 엄격하게 config에서 속성의 이름을 지정하고 내장 된'Validators' 또는'Validator'에서'Validator' 함수/속성을 추가해야하는지 여부를 결정하기 위해 일종의 pattern/regex 검사를 사용하여이를 해결할 수 있습니다 커스텀 검증 파일. – amal

+1

예, 감사합니다. 고마워요. 나는 방금 이것을 시도 할 기회를 가졌습니다 (첫 번째 방법). 제 생각에'this.populateValidatorsList()'에서 this.fieldData [ 'exampleField'] [ 'validators']'를 인자로 전달하려고했던 것 같습니까? 그러나, 나는 'TypeError : v가 내 콘솔에있는 함수가 아닙니다.'라는 오류를 얻고 있습니다. 이유가 확실하지 않습니다 ... – Inigo