gpt4 book ai didi

Angular9 的 react 形式和原子设计

转载 作者:行者123 更新时间:2023-12-03 23:45:57 25 4
gpt4 key购买 nike

我正在实现 atomic design在我的 Angular 9 应用程序中。这意味着我将用原子、分子和有机体来构建我的页面。一切正常,除了 ReactiveFormsModule。
我想转换 <input />到它自己的组件,这样我就不必一直复制关联的 HTML。然而, react 形式没有任何它。
下面的示例在加载时返回错误:ERROR Error: No value accessor for form control with name: 'field2'我做了一个 StackBlitz带有完整代码的示例。
app.component.ts

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

@Component({selector: 'app-root',templateUrl: './app.component.html'})
export class AppComponent {
form: FormGroup;

constructor(fb: FormBuilder) {
this.form = fb.group({
field1: ['value1', [Validators.required]],
field2: ['value2', [Validators.required]],
});
}

onSubmit() {console.log(this.form.value);}
}
app.component.html 在这里,我尝试用原子替换第二个输入。
<form [formGroup]="form" (ngSubmit)="onSubmit();">
<label>
Field 1 <input formControlName="field1" />
</label>

<label>
Field 2 <app-input formControlName="field2"></app-input>
</label>

<button type="submit">Submit</button>
</form>
input.component.ts
import { Component, OnInit, Input } from '@angular/core';

@Component({
selector: 'app-input',
template: '<input [formControlName]="formControlName" />',
})
export class InputComponent implements OnInit {
@Input() formControlName: string;

constructor() { }

ngOnInit(): void {
}

}
我试图实现一个 ControlValueAccessor , 通过 this tutorial但这导致了奇怪的行为。
谁能告诉我如何实现这一目标?

最佳答案

如果你想让你的生活更轻松,那么使用 FormControl 作为来自你的自定义组件的输入
这是我的应用程序中的代码

// custom component 
@Input() set control(value: FormControl) {
if (this._control !== value) {
this._control = value;
}
}
// tempalte
<input [formControl]="_control">
输入父控件我不使用 formBuilder 而是直接使用 fromControl 和 formGroup 。
name = new FormControl('');

constructor(){
let name = this.name;
this.formGroup = new FromGroup({name });


// template
<custom-control [control]="name">
将解决方案更新为问题中的示例:
app.component.ts
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';

@Component({selector: 'app-root',templateUrl: './app.component.html'})
export class AppComponent {
form: FormGroup;

constructor(fb: FormBuilder) {
this.form = fb.group({
field1: ['value1', [Validators.required]],
field2: ['value2', [Validators.required]],
});
}

onSubmit() {console.log(this.form.value);}
}
app.component.html
<form [formGroup]="form" (ngSubmit)="onSubmit();">
<label>
Field 1 <input formControlName="field1" />
</label>

<label>
Field 2 <app-input [control]="form.controls.field2"></app-input>
</label>

<button type="submit">Submit</button>
</form>
input.component.ts
import { Component, OnInit, Input } from '@angular/core';

@Component({
selector: 'app-input',
template: '<input [formControl]="formControl" />',
})
export class InputComponent implements OnInit {
@Input() set control(value: FormControl) {
if (this.formControl !== value) {
this.formControl = value;
}
}

formControl: FormControl;

constructor() { }

ngOnInit(): void { }
}

关于Angular9 的 react 形式和原子设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62773481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com