angular - Angular 8 应用程序在使用 router.navigate 时无法检索表单字段值
问题描述
我有一个使用路由和模板驱动表单的 Angular 8 应用程序。
我在component.html 中有一个简单的表单:
<form (ngSubmit)="onSubmit(serviceForm)" #serviceForm="ngForm">
<input type="text" name="endpoint" ngModel>
<button class="btn btn-success" type="submit">Submit</button>
</form>
component.ts中的处理程序:
onSubmit(serviceForm:NgForm){
console.log(serviceForm);
this.router.navigate(['/view-service']);
}
当我在 console.log() 之后调用导航语句时,ngForm.value 中没有“端点”。这是 console.log 的输出:
NgForm {submitted: true, _directives: Array(1), ngSubmit: EventEmitter, form: FormGroup}
formDirective: (...)
control: (...)
path: (...)
controls: (...)
value :对象
__proto__:对象
有效:(...)
无效:(...)
待定:(...)
禁用:(...)
启用:(...)
错误:(...)
原始:( ...)
脏:真
感动:真
状态:(...)
未动:(...)
statusChanges:(...)
valueChanges:(...)
提交:真
如果我不调用导航语句,它是可用的。
我不明白,我在导航之前打印到控制台。
我在这里做错了什么?
谢谢!
解决方案
这是因为您正在查看表单,但您想要的是表单中包含的特定值。将您的代码更改为以下内容:
onSubmit(serviceForm: NgForm){
console.log(serviceForm.value.endpoint);
}
我在 stackblitz 上创建了一个演示应用程序,使用您的确切形式说明了这一点。另外——请务必阅读表格上的文档。
编辑以解决您编辑的问题
您正在记录对表单对象的引用,但是当您在开发工具中检查它时,您已经离开页面,因此表单值不可用。这在MDN Web Docs中有解释。具体来说:
请注意,如果您在最新版本的 Chrome 和 Firefox 中记录对象,您在控制台上记录的内容是对对象的引用,这不一定是您调用控制台时对象的“值”。 log(),但它是打开控制台时对象的值。
试试 MDN 的建议:
记录对象
不使用
console.log(obj)
,使用console.log(JSON.parse(JSON.stringify(obj)))
。
推荐阅读
- python - 熊猫:或如果值包含“-”,则执行
- android - `getPlaceById` 由于 `places.get(0);` 失败 // 无法解析方法 get(int)
- python - 在 Python 中比较两个列表的有效方法(从 R 代码转换)
- amazon-web-services - 配置 elastic-beanstalk 负载均衡器安全组
- excel - 如何将长表附加到一张主表中(不合并)
- python - Pandas iterrows 只给出最后一行的结果
- python - 如何使用 dask 读取 csv 和处理行?
- python - Pyspark:扩展数据集以包括邻居
- c++ - 如何就地创建+填充容器?
- php - PHP选择和分组并保存到文件