angular Mark FormControlDirective as standalone

xzlaal3s  于 3个月前  发布在  Angular
关注(0)|答案(4)|浏览(43)

与功能请求相关的@angular/*包有哪些?

forms

描述

如果可能的话,将FormControlDirective标记为独立的组件会更好。这样它就可以作为其他组件的宿主指令使用。例如,我们正在使用它(有解决方法),动态渲染和绑定表单输入。
当前当指令用作宿主指令时,会出现以下错误。
[ERROR] TS-992014: Host directive FormControlDirective must be standalone [plugin angular-compiler]

使用以下代码片段:

hostDirectives: [ {
  directive: FormControlDirective,
  inputs: [ 'formControl' ]
} ]

建议的解决方案

将FormControlDirective标记为独立组件

考虑过的替代方案

目前我们扩展了FormControlDirective,因此可以在不进行任何其他更改的情况下将其标记为独立组件。然后我们可以使用该自定义组件作为宿主指令。

import { Directive } from '@angular/core';
import { FormControlDirective } from '@angular/forms';

@Directive( {
  standalone: true
} )
export class HostFormControlDirective extends FormControlDirective {
}

stackblitz example

py49o6xq

py49o6xq1#

表单需要在元素上存在其他指令才能正常工作(具体来说是 ControlValueAccessor 指令)。这就是为什么它们不能独立使用的原因——开发者无法正确地导入和使用 FormControlDirective 指令,而其他 ReactiveFormsModule 指令。

FormControlDirective 作为宿主指令是一个有趣的问题——它并不是真正设计成这样使用的,我不确定这样做能提供多少价值。作为宿主指令应用它的用途是什么?

ycggw6v2

ycggw6v22#

我在这里补充一个使用案例。我们有一个指令,应用于 selectinput,以提供自定义表单控件样式和行为。如果它能像这样使用就更好了:

<input [appFormControl]="formGroup.controls.foo" />

然后 CustomFormControlDirective 会将 FormControlDirective 作为宿主指令应用。目前这是无法实现的,所以我们不得不采用

<input [appFormControl]="formGroup.controls.foo" [formControl]="formGroup.controls.foo" />
rqqzpn5f

rqqzpn5f3#

表单需要在元素上存在其他指令才能正常工作(特别是ControlValueAccessors)。这就是为什么它们不是独立的——开发者无法正确地独立导入和使用FormControlDirective,而是需要依赖于其他ReactiveFormsModule指令。
这听起来像是一个尚未被独立API覆盖的使用案例,对吗?

vbkedwbf

vbkedwbf4#

表单需要在元素上存在其他指令才能正常工作(具体来说是 ControlValueAccessor 指令)。这就是为什么它们不能独立使用的原因——开发者无法正确地导入和使用 FormControlDirective 指令,而是需要与其他 ReactiveFormsModule 指令一起使用。

确实,它确实需要更多的代码来实现。例如,组件本身还需要实现 ControlValueAccessor(可能还需要实现 Validator)。这就是为什么我添加了一个工作示例的 stackblitz。它与我们在应用程序中使用的有些相似,但规模要小得多,并且简化了。

相关问题