html - 具有来自组件的动态数据更改的反应式表单
问题描述
我在 Angular 6 中设置了一个反应式表单,其中我有 2 个输入框(一个输入是可选条目)和一个提交按钮。如果我在一个输入框中输入一个值并按下提交,我需要通过从组件端设置相应的值来填充另一个输入框。如果我在两个输入框中输入值,则会调用另一个函数。如果是这样,如何在表单控件中进行双向数据绑定?我尝试使用 ngModel,它没有按预期工作,并且从 stackoverflow 的答案中了解到,使用带有表单控件的 ngmodel 很快就会被弃用。如果是这样,我怎样才能达到同样的效果?下面是我正在使用的代码片段:
组件.ts:
export class myComponent implements OnInit {
converterForm: FormGroup;
model: myModel = new MyModel();
constructor(private formBuilder: FormBuilder, ) {
this.myForm = this.formBuilder.group({
vOne: [this.model.vOne],
vTwo: [this.model.vTwo],
});
}
onSubmit(searchInputs) {
this.model.vTwo= "new"; //I need to edit the form value and reflect it in html.. two-waybinding
this.converterForm.value.vOne = "edited";
console.log("Submit called");
}
}
.html 文件:
<div>
<div>
<form [formGroup]="myForm" (ngSubmit)="onSubmit(myForm.value)">
<div>
<div>
<mat-form-field>
<input id="vOne" matInput formControlName="vOne" [(ngModel)]="model.vOne">
</mat-form-field>
</div>
<div>
<mat-form-field>
<input id="vTwo" matInput formControlName="vTwo" [(ngModel)]="model.vTwo">
</mat-form-field>
</div>
</div>
<div>
<button mat-raised-button color="primary" type="submit" (click)="search()">
<mat-icon aria-label="Search icon">search </mat-icon>
Search
</button>
</div>
</form>
</div>
提前致谢。
解决方案
使用valueChanges访问实时更改,并使用setValue func 设置每个输入的值。
在 ts 文件中尝试:
export class myComponent implements OnInit {
myForm: FormGroup;
constructor(private formBuilder: FormBuilder) {
this.myForm = this.formBuilder.group({
vOne: [null],
vTwo: [null],
});
searchHandler();
}
searchHandler() {
const searchInputs = {
vOne: '',
vTwo: '',
};
for (const propertyName in searchInputs) {
const property = this.form.get(propertyName);
property.valueChanges
.subscribe((searchText) => {
// this.form.controls.vOne.setValue('whatever');
// this.form.controls.vTwo.setValue('whatever');
// searchText is what keypress in input tag
});
}
}
onSubmit() {
// this.form.controls.vOne.setValue('whatever');
// this.form.controls.vTwo.setValue('whatever');
}
}
在 html 文件中尝试:
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<div>
<mat-form-field>
<input matInput formControlName="vOne">
</mat-form-field>
</div>
<div>
<mat-form-field>
<input matInput formControlName="vTwo">
</mat-form-field>
</div>
</form>
推荐阅读
- python - 如何绘制一个 numpy rgb 数组?
- python - Python类函数,不能追加到列表
- java - 我有一个包含 .length 和 .charAt 的错误,前面有一个令牌。为什么它不起作用?
- apache-spark - 停止在 Kubernetes 集群上运行的火花作业的最优雅/正确的方法是什么?
- android - 将 SMS Retriever API 与即时应用程序一起使用
- python - 掷骰子概率
- html - 多个 JavaScript 函数未运行
- javascript - 一个元素正在遍历 html 和 css 中的另一个元素
- php - 在 Wordpress 中使用数据库中的数据创建自定义页面
- r - 如何生成连接0和1的不同曲率的曲线?