【发布时间】:2021-03-02 16:46:00
【问题描述】:
我正在尝试在我的网站内创建一个论坛。在努力使用模板驱动的表单来实现之后,我决定切换到响应式表单。我在整个站点中一直在这两种方法之间切换,并意识到反应式表单有一个缺点,导致我选择模板驱动的表单,我怀疑有一种解决方法值得弄清楚。我遇到的问题是,当用户想要编辑他们已经创建的内容时,我使用与创建相同的表单,但将文档 ID 附加到路由中,如下所示:
localhost:4200/create-thread/some-thread-uid
当遵循这条路线时,它会加载创建线程组件,但会将已经提供的数据预加载到适当的表单控件中。这是通过使用双向绑定将线程对象附加到相关表单的 ngModel 来完成的。像这样:
<!-- <form #finished="ngForm" (ngSubmit)="save(finished.value)">
<div class="form-group">
<label for="author">Author of thread:</label>
<input
#author="ngModel"
[(ngModel)]="thread.author"
name="author"
id="author"
class="form-control"
required
type="text">
</div>
</form>
我的问题是,有没有办法使用响应式表单来实现这一点(将存储在云数据库中的对象中已经提供的信息加载到输入字段中进行编辑)?我尝试了几种方法但无法弄清楚,包括将“thread.author”注入表单构建器中的适当字段。 任何帮助表示赞赏。
【问题讨论】:
-
有两种方法,一种是使用表单构建器注入它,即您提到的
new FormControl(value, ...),另一种是使用FormControl.setValue(value)手动设置 -
并且您可以在更改参数时使用
Form.reset()清除表单,以避免在下一个id数据加载失败或promise仍处于未决状态时出现先前id的旧数据跨度> -
@BeshambherChaukhwan 对于第二种解决方案,我会将这段代码放在组件的 setter 中的什么位置?不知道为什么,但使用 formbuilder 对我不起作用,我目前在我的代码中有它,当我打开一个线程进行编辑时,所有输入字段都是空的
-
有人在下面回答了这个问题。请尝试一下。如果这不起作用,那么我会提出我的答案。您将在收到更新的数据并希望在表单中显示后立即设置该值。由于表单是响应式的,因此每当表单控件值发生变化时,它都会反映在表单中。现在什么时候做这取决于你的需要。
标签: angular angular-reactive-forms angular-template-form