我有简单的形式
\n\n<form novalidate #f="ngForm">\n <mat-form-field class="example-full-width">\n <input matInput placeholder="Favorite food" name="myname" required [(ngModel)]="comment">\n <mat-error>Is required lol</mat-error>\n </mat-form-field>\n\n <mat-form-field class="example-full-width">\n <input matInput placeholder="Favorite food" required name="some">\n </mat-form-field>\n</form>\n
Run Code Online (Sandbox Code Playgroud)\n\n和组件作为
\n\nexport class InputOverviewExample {\n comment = null;\n @ViewChild(\'f\')\n form: NgForm\n\n\n ngOnInit() {\n console.log(this.form.controls);\n console.log(Object.keys(this.form.controls));\n\n console.log(this.form.controls.myname);\n console.log(this.form.controls[\'myname\']);\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n问题是,控制台输出是:
\n\n{}\n\xe2\x80\x8b\n myname: Object { pristine: true, touched: false, status: "INVALID", \xe2\x80\xa6 }\n Array []\n undefined\n
Run Code Online (Sandbox Code Playgroud)\n\n那么为什么我无法按名称访问表单控件,为什么Object.keys
在控制台说有一些键时返回空数组form.controls
??\n这是一个游乐场,所以请忽略重复的表单输入等。\n https://stackblitz.com/edit/角乌尔克尔
你错过了 onInit 实现,
首先添加InputOverviewExample implements OnInit
正确实现和使用该ngOnInit
功能。
其次,由于反应式表单是同步的,因此console.log
在表单获取之前initialized
和form control
添加之前运行。
另外,表单控件的一般实现form builder
使用in 构造函数,因为您还没有采用它,所以您已经遇到过这个问题,所以下面的代码将为您解决它
import { Component, ViewChild, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
/**
* @title Basic Inputs
*/
@Component({
selector: 'input-overview-example',
styleUrls: ['input-overview-example.css'],
templateUrl: 'input-overview-example.html',
})
export class InputOverviewExample implements OnInit {
comment = null;
@ViewChild('f')
form: NgForm
ngOnInit() {
setTimeout(() => {
console.log(this.form.controls);
console.log(typeof this.form.controls);
console.log(Object.keys(this.form.controls));
console.log(this.form.controls.myname);
console.log(this.form.controls['myname']);
})
}
}
Run Code Online (Sandbox Code Playgroud)
附:
对于你的问题那么模板驱动的表单可以在后台的反应式表单 API 上工作吗?,答案是肯定的
解释如下:
NgModel 指令创建 FormControl 实例来管理模板表单控件,并且 name 属性告诉 NgModel 指令将该 FormControl 存储在父 FormGroup 中的键下
<input name="foo" ngModel>
Run Code Online (Sandbox Code Playgroud)
相当于:
let model = new FormGroup({
"foo": new FormControl()
});
Run Code Online (Sandbox Code Playgroud)
您面临的主要问题是控制台行为,
Console
首先执行,然后将值分配给它,因此在控制台执行后分配值时将无法访问任何方法。
归档时间: |
|
查看次数: |
8604 次 |
最近记录: |