类型“AbstractControl”Angular 4 上不存在属性“控件”[重复]

Posted

技术标签:

【中文标题】类型“AbstractControl”Angular 4 上不存在属性“控件”[重复]【英文标题】:Property 'controls' does not exist on type 'AbstractControl' Angular 4 [duplicate] 【发布时间】:2018-04-06 04:12:16 【问题描述】:

我正在 Angular 4 中尝试嵌套的响应式表单。它工作正常,但是当我尝试构建 AOT 时它会抛出错误

“AbstractControl”类型上不存在“控件”

我用谷歌搜索并尝试了一些东西,但没有运气。谁能告诉我如何解决这个问题?

<div [formGroup]="myForm">
    <div formArrayName="addresses">
        <div *ngFor="let address of myForm.get('addresses').controls; let i=index" 
                    class="panel panel-default">
            <span *ngIf="myForm.get('addresses').length > 1"
                    (click)="removeAddress(i)">Remove</span>
            <div [formGroupName]="i">
                <mat-form-field>
                    <input matInput formControlName="city" placeholder="city" value="">
                </mat-form-field>
            </div>

        </div>
    </div>
    <a (click)="addAddress()" style="cursor: default"> Add +</a>
</div>

打字稿代码如下

constructor(private _fb: FormBuilder)      


ngOnInit() 
    this.myForm = this._fb.group(
        addresses: this._fb.array([
            this.initAddress(),
        ])
    );

initAddress() 
    return this._fb.group(
        city: ['']
    );

addAddress() 
    const control = <FormArray>this.myForm.get('addresses');
    control.push(this.initAddress());

removeAddress(i: number) 
    const control = <FormArray>this.myForm.get('addresses');
    control.removeAt(i);

【问题讨论】:

我认为首选的方式是myForm.get('addresses') @GünterZöchbauer 我们需要在 html ngFor 或 Typescript 中使用它吗? 如果myFormAbstractControl,则两者都应该工作 @GünterZöchbauer 根据您的建议更新了问题中的代码,它工作正常但 AOT 抛出相同的错误:(任何想法?请检查代码 创建像 get addressesControls() return (&lt;FormArray&gt;this.myForm.get('addresses')).controls; 这样的 getter 或者只使用下面的 myForm.get('addresses')['controls'] 【参考方案1】:

基于@Günter Zöchbauer cmets,首先我改变了

myForm.controls['addresses']myForm.get('addresses') 在 html 和 typescript 中

然后根据@yuruzi 评论

myForm.get('addresses').controls 更改为myForm.get('addresses')['controls']

它现在工作正常。谢谢@gunter & yuruzi

【讨论】:

我的案例:form.get('user')['controls'].profile。没关系 tnks 这对我来说是天衣无缝的。谢啦!在 tempate myForm.get('addresses')['controls'] 在 ts const control = this.myForm.controls.addresses as FormArray 有点魔法,它必须在没有数组符号的情况下工作...... 它对我有用,谢谢!【参考方案2】:

不过,您可以轻松修复它。将“获取控件”逻辑外包到组件代码的方法中(.ts 文件):

getControls() 
  return (this.recipeForm.get('controlName') as FormArray).controls;

在模板中,然后可以使用:

*ngFor="let ingredientCtrl of getControls(); let i = index"

由于 TS 的工作方式和 Angular 解析您的模板的方式,需要进行此调整(它不理解 TS)。

【讨论】:

也许在以后的 Angular 版本中你必须使用return (this.recipeForm.get('controlName') as FormArray).controls;【参考方案3】:

myForm.get('addresses').controls 更改为myForm.get('addresses').value 也可以解决此问题。

【讨论】:

【参考方案4】:

作为@sunny kashyap 解决方案的更新,我会这样写:

getControls() 
  return (this.recipeForm.get('controlName') as FormArray).controls;

【讨论】:

【参考方案5】:

对于验证错误使用...

<span *ngIf="f.YOUR_FORM_KEY.controls.YOUR_FORM_KEY.errors?.YOUR_FORM_VALIDATION">YOUR_FORM_KEY is YOUR_FORM_VALIDATION</span>

例如。

<span *ngIf="f.name.controls.name.errors?.required">Name is required</span>

ts 文件

get f(): any 
    return this.userForm.controls;

【讨论】:

【参考方案6】:

要获得 FormArray 的长度,只需使用 length

<span *ngIf="myForm.controls['addresses'].length > 1" (click)="removeAddress(i)">Remove</span>

希望对你有帮助

【讨论】:

谢谢。但它不能解决问题。 是的@mohammed,请检查有问题的更新代码 你可以试试这个let address of myForm.controls.addresses.controls而不是let address of myForm.get('addresses').controls【参考方案7】:

可以使用自定义界面

// Define AbstractFormGroup
export interface AbstractFormGroup extends FormGroup 
  controls: 
    [key: string]: AbstractFormGroup & AbstractFormGroup[] & AbstractControl & FormGroup & FormArray,
  


// Usage example
class ... 
  myForm: AbstractFormGroup
  ...
  this.myForm = this.fb.group(...) as AbstractFormGroup

【讨论】:

以上是关于类型“AbstractControl”Angular 4 上不存在属性“控件”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

元素隐含地具有“任何”类型,因为类型“AbstractControl”没有索引签名。您的意思是调用“get”吗?ngtsc(7052)

将 ngModel 模板引用变量作为 AbstractControl 传递给输入变量

前端小白之每天学习记录----angula2--

未捕获的错误:类型地理位置没有“ɵmod”属性

迭代 Angular 2+ FormArray

Angular2:有条件的验证