반응형의 양방향 바인딩
Angular 2를 사용하면 템플릿 기반 양식에서 양방향 바인딩이 쉬워집니다. 바나나 상자 구문만 사용하면 됩니다.모델 중심의 형태로 이 동작을 어떻게 복제하시겠습니까?
예를 들어, 여기 표준 반응형이 있습니다.다양한 입력과 비즈니스 논리로 보기보다 훨씬 복잡하며, 따라서 템플릿 중심 접근 방식보다 모델 중심 접근 방식에 더 적합하다고 가정해 보겠습니다.
export class ExampleModel {
public name: string;
// ... lots of other inputs
}
@Component({
template: `
<form [formGroup]="form">
<input type="text" formControlName="name">
... lots of other inputs
</form>
<h4>Example values: {{example | json}}</h4>
`
})
export class ExampleComponent {
public form: FormGroup;
public example: ExampleModel = new ExampleModel();
constructor(private _fb: FormBuilder) {
this.form = this._fb.group({
name: [ this.example.name, Validators.required ]
// lots of other inputs
});
}
this.form.valueChanges.subscribe({
form => {
console.info('form values', form);
}
});
}
에서subscribe()
양식 값에 모든 종류의 논리를 적용하고 필요에 따라 매핑할 수 있습니다.그러나 양식의 모든 입력 값을 매핑하고 싶지는 않습니다.나는 단지 전체의 가치를 보고 싶을 뿐입니다.employee
업데이트 시 모델링, 유사한 접근 방식[(ngModel)]="example.name"
템플릿의 json 파이프에 표시된 대로입니다.어떻게 하면 이 일을 해낼 수 있을까요?
참고: @Clouse24에서 언급한 바와 같이, "ngModel과 함께 반응성 프롬을 사용하는 것은 Angular 6에서는 더 이상 사용되지 않으며 Angular 이후 버전에서는 제거될 것입니다."(아래 답변은 앞으로 더 이상 지원되지 않을 것임을 의미합니다.링크를 읽어보면 비권장 이유를 알 수 있고 대안이 무엇인지 알 수 있습니다.
사용할 수 있습니다.[(ngModel)]
반응형을 사용합니다.
템플릿
<form [formGroup]="form">
<input name="first" formControlName="first" [(ngModel)]="example.first"/>
<input name="last" formControlName="last" [(ngModel)]="example.last"/>
</form>
요소
export class App {
form: FormGroup;
example = { first: "", last: "" };
constructor(builder: FormBuilder) {
this.form = builder.group({
first: "",
last: ""
});
}
}
이 지침은 다음 지침 없이 사용되는 지침과 완전히 다릅니다.formControlName
반응형을 사용하면 다음과 같습니다.FormControlNameDirective
다음을 제외하고는formControlName
,그NgModel
지시문이 사용됩니다.
때로는 [(ngModel)]을(를) 반응형 양식과 결합해야 할 수도 있습니다.양식의 일부로 필요하지 않은 입력 컨트롤이 될 수 있지만 컨트롤러에 바인딩해야 합니다.그런 다음 다음을 사용할 수 있습니다.[(ngModel)]="something" [ngModelOptions]="{standalone: true}"
문제를 해결할 수 있는 방법은(는 다음과 같습니다.
- 바로 가기 --> STACKBLITZ
의 결과를 얻기 위해two-way-binding
로컬 "템플릿 변수"를 사용하고 두 필드 모두에 대해 동일한 formControl을 사용합니다.
<form [formGroup]="formGroup">
<input #myInput (input)="mySlider.value = myInput.value" type="number" formControlName="twoWayControl">
<mat-slider #mySlider (input)="myInput.value = mySlider.value" formControlName="twoWayControl" min="1" max="100">
</mat-slider>
</form>
사용하는 모델의 값을 프로그래밍 방식으로 변경하려는 경우setValue()
남들이 공언한 바와 같이
setTo33() {
this.formGroup.get('twoWayControl').setValue(33);
}
// Allow two way binding on the [(name)] from the parent component
private nameValue: string;
@Input()
get name() {
return this.nameValue;
}
set name(values) {
this.nameValue = values;
this.nameChange.emit(this.nameValue);
}
@Output() nameChange = new EventEmitter<string>();
ngOnInit() {
// Update local value and notify parent on control value change
this.formControl.valueChanges.forEach(value => this.name = value));
}
ngOnChanges() {
// Update local value on parent change
this.formControl.setValue(this.expression);
}
Angular 6+ 솔루션...
저도 양방향 데이터 바인딩을 사용하면서 반응형 검증을 원합니다.내가 생각해낸 가장 좋은 해결책은 양식 그룹의 것을 낚아채는 것이었습니다.valueChanges
와 함께하는 이벤트debounce
모델을 업데이트하는 타이머입니다.다음은 예입니다.
<form [formGroup]="form">
<input class="form-control" type="date" name="myDate" formControlName="myDate">
</form>
public myModel = {
myDate: '2021-01-27'
};
public form = this.builder.group({
myDate: [this.myModel.myDate, [Validators.required]],
});
// Don't update the model with every keypress, instead wait 1s and then update
this.form.valueChanges.pipe(debounceTime(1000)).subscribe((changes) => {
for (let key of Object.keys(changes)) {
this.myModel[key] = values[key];
}
});
복사/붙여넣기를 더 잘 돕기 위해 주어진 변경 사항으로 모델의 모든 속성 값을 업데이트할 것입니다.양방향 데이터 바인딩을 사용하여 하나의 속성만 업데이트하려는 경우 다음과 같은 방법을 사용해야 합니다.
this.form.get('myDate').valueChanges.pipe(debounceTime(1000)).subscribe((changes) => {
this.myModel.myDate = changes.myDate;
});
입력 값을 표시하려면 입력에 변수를 만들어 템플릿에서 사용하십시오.
<form [formGroup]="form">
<input type="text" formControlName="name" #name>
... lots of other inputs
</form>
<h4>Example values: {{ name.value }}</h4>
ngModel 또는 Template 기반 폼과 반응형 폼(모델 기반 폼)을 함께 혼합할 수 있습니다.예를 들어 TDF를 사용하면 구독 없이 데이터를 쉽게 읽을 수 있고, 반면 MDF를 사용하면 몇 가지 검증을 제공할 수 있습니다. 하지만 그 중 하나만 선택하고 싶습니다.
TDF의 가장 큰 단점은 유닛 테스트를 적용할 수 없다는 것이고 반대로 TDF를 사용할 때 템플릿이 훨씬 더 더럽다는 것입니다.
반응형 양식을 사용하여 양방향 바인딩을 수행할 수 있습니다.
constructor(private fb: FormBuilder)
this.formData= fb.group({
variable: new FormControl(value,Validators.required)
})
//the 'value' attribute carries the value you want to bind
var value="Eamanpreet Singh"
<form [formGroup]="formData" (ngSubmit)="submit();">
<mat-form-field>
<input matInput placeholder="Name" formControlName="variable">
</mat-form-field>
언급URL : https://stackoverflow.com/questions/40458739/two-way-binding-in-reactive-forms
'bestsource' 카테고리의 다른 글
하나 이상의 잘못된 서명이 발견되었습니다. (0) | 2023.07.28 |
---|---|
두께를 변경하려면 어떻게 해야 합니까?두께를 변경하려면 어떻게 해야 합니까?두께를 변경하려면 어떻게 해야 합니까?꼬리표를 달다꼬리표를 달다꼬리표를 달다 (0) | 2023.07.28 |
PowerShell에서 어레이 어레이를 생성하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
반복기가 적어도 하나의 요소를 산출하는지 확인하기 위한 원라이너? (0) | 2023.07.28 |
이벤트 로그가 이미 있는지 확인하는 방법 (0) | 2023.07.28 |