具有反应形式的ngModel
Angular v6 已弃用对 ngModel 输入属性和 ngModelChange 事件与反应式表单指令的支持,并将在 Angular 的未来版本中删除。 p>
现已弃用:
<input [formControl]="control" [(ngModel)]="value">
this.value = 'some value';
这已被弃用有几个原因。首先,开发人员发现这种模式令人困惑。似乎正在使用实际的 ngModel 指令,但实际上它是响应式表单指令上名为 ngModel 的输入/输出属性,它近似于部分但不是全部指令的行为。它允许获取和设置值并拦截值事件,但 ngModel 的一些其他功能,例如使用 ngModelOptions 延迟更新或导出指令,不起作用.
此外,这种模式混合了模板驱动和响应式表单策略,这阻碍了利用这两种策略的全部优势。在模板中设置值违反了响应式表单背后的模板无关原则,而在类中添加 FormControl/FormGroup 层会消除在模板中定义表单的便利性。
要在移除支持之前更新您的代码,您需要决定是坚持使用响应式表单指令(并使用响应式表单模式获取/设置值)还是切换到模板驱动的指令。
之后(选择 1 - 使用反应形式):
<input [formControl]="control">
this.control.setValue('some value');
之后(选择 2 - 使用模板驱动的表单):
<input [(ngModel)]="value">
this.value = 'some value';
默认情况下,当您使用此模式时,您会在开发模式下看到一次弃用警告。您可以选择通过在导入时为 ReactiveFormsModule 提供配置来消除此警告:
imports: [
ReactiveFormsModule.withConfig({warnOnNgModelWithFormControl: 'never'});
]
或者,您可以选择为该模式的每个实例显示一个单独的警告,配置值为 “always”。这可能有助于在代码更新时跟踪在代码中使用模式的位置。
参考:
https://angular.io/guide/deprecations#ngmodel-with-reactive-forms