Khi bạn muốn thực hiện một thành phần tùy chỉnh cho dữ liệu liên kết với một giá trị cá nhân Cách góc chính xác để thực hiện điều đó là đi theo phương pháp mà chế độ xem gốc chỉ định [formControl]
hoặc [formControlName]
.
<app-form-group formControlName="name"></app-form-group>
<app-form-group formControlName="email"></app-form-group>
<app-form-group formControlName="other"></app-form-group>
Trong kiểm soát trẻ em của bạn, bạn cần phải làm như sau:
Đầu tiên thêm nhà cung cấp sau đây để khai @Component
bạn, do đó góc biết thành phần của bạn có thể làm việc với [formControlName]
/[formControl]
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CountrySelectorComponent),
multi: true
}
]
Lớp của thành phần con bạn cần triển khai giao diện ControlValueAccessor
. nên là một ví dụ hoàn toàn hoạt động, nếu không thì hãy cho tôi biết và tôi sẽ thay đổi mã, tôi đã nhập trực tiếp vào trình duyệt.
@Component({
// Ensure [formControl] or [formControlName] is also specified
selector: '[formControl] app-form-group, [formControlName] app-form-group',
templateUrl: './country-selector.component.html',
styleUrls: ['./country-selector.component.scss'],
providers: [
{
// Provide the value accessor
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CountrySelectorComponent),
multi: true
}
]
})
export class CountrySelectorComponent implements ControlValueAccessor {
private value: any;
private hasHadFocus = false;
private hasNotifiedTouched = false;
private propagateChange: any =() => {};
private propogateTouched: any =() => {};
public changed(event: any) {
this.value = event.srcElement.value;
this.propagateChange(this.value);
}
/**
* Called when (focus) is triggered
*/
public focused() {
this.hasHadFocus = true;
}
/**
* Called when (blur) is triggered
*/
public blurred() {
if (this.hasHadFocus && !this.hasNotifiedTouched) {
// Only notify once, and only if lost focus after a focus
this.hasNotifiedTouched = true;
this.propogateTouched();
}
}
/**
* Called when a new value is set via code
* @param obj
*/
writeValue(obj: any): void {
this.value = obj;
}
/**
* Register a call back to call when our value changes
* @param fn
*/
registerOnChange(fn: any): void {
this.propagateChange = fn;
}
/**
* Register a call back to call when our value is first touched
* @param fn
*/
registerOnTouched(fn: any): void {
this.propogateTouched = fn;
}
}
mẫu app-form-group
của bạn sẽ giống như thế này
<div class="form-group">
<label class="col-md-2 control-label">{{Name}}</label>
<div class="col-md-9">
<input class="form-control" (blur)="blurred()" focus="focussed()" change="changed($event)">
</div>
- Thêm
[formGroup]="signupForm"
cho mỗi app-form-group
trường hợp của bạn trong giao diện chính của bạn
- Thực hiện OnInit trong kiểm soát
app-form-group
của bạn.
- Thêm
private controlContainer: ControlContainer
để các nhà xây dựng của thành phần app-form-group
của bạn để góc sẽ bơm nó
- Thêm
public form: FormGroup;
tài sản để thành phần app-form-group
của bạn.
Trong ngOnInit hãy thêm mã sau đây
this.form = this.containerControl.control;
Trong mẫu app-form-group
của bạn, bạn sẽ thêm [formGroup] như vậy
Đây là phương pháp đòi hỏi phải có số tiền ít nhất của mã số, và là một trong tôi muốn giới thiệu khi bạn muốn nhúng điều khiển tổng hợp chỉnh sửa nhiều phần dữ liệu (như Địa chỉ).
Từ blog này ->https://mrpmorris.blogspot.co.uk/2017/08/angular-composite-controls-formgroup-formgroupname-reactiveforms.html
Bạn sẽ cần phải thực hiện riêng của bạn 'ControlValueAccessor' theo hướng dẫn ở đây http://blog.thoughtram.io/angular/2016/07/27/custom-form-controls- in-angular-2.html –