首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制的控制

控制的控制
EN

Stack Overflow用户
提问于 2022-07-13 09:06:08
回答 2查看 25关注 0票数 0

目前,我正在使用mat-errors和hasErrors对我的表单进行验证,直到我需要另一个“内部”表单组的控制,我的意思是:

代码语言:javascript
复制
prozessPersonenzuordnungenForm = new FormGroup({
    person: new FormGroup({
      firmenbezeichnung: new FormControl(),
      nameC: new FormControl('', [Validators.required]),
      briefanrede: new FormControl('x'),
    }),
  });

我正在尝试达到person.nameC验证。我正在使用这个函数:

代码语言:javascript
复制
public hasError = (controlName: string, errorName: string) => {
    return this.prozessPersonenzuordnungenForm.controls[controlName].hasError(
      errorName
    );
  };

问题是,使用这个函数,我只访问person FormGroup,而不是nameC formControl。所以我需要另一个“更深层次的控制”。

我的html就是这样的:

代码语言:javascript
复制
<mat-error *ngIf="hasError('nameC', 'required')">Bitte gebe eine Person an!</mat-error>

我也用person.nameC在html中尝试过,但这也不起作用。用我的FormControl函数访问我的内部hasError的好方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2022-07-13 09:19:01

由于您的controls属性是一个具有简化结构的对象:

代码语言:javascript
复制
controls = {
    person: {
       nameC: {
         hasErrors: err => bool
       }
    }
}

您不能说是controls["person.nameC"],因为没有这样的属性,而且这些点符号不会自动转换为嵌套的属性访问。

这完全取决于你如何处理它们。一种方法是解析点分隔字符串,拆分它们,并尝试在循环中访问对象。

例如,如果将"person.nameC"字符串拆分为.数组,则将收到arr = [ "person", "nameC" ]

现在让我们来看看算法:

代码语言:javascript
复制
let property = controls;

我们从最远处的属性开始--整个控制对象。我们一个接一个地深入到:

代码语言:javascript
复制
property = property[ arr[0] ]

这将计算为property = property["person"],这将使property变量看起来如下:

代码语言:javascript
复制
property = {
    nameC: {
       hasErrors: err => bool
    }
}

现在你可以继续用同样的方式

代码语言:javascript
复制
property = property[ arr[1] ]

它将评估为property = property["nameC"],最终结果将是

代码语言:javascript
复制
property = {
    hasErrors: err => bool
}

这就是你想要的。

当然,您不需要手动处理,您只需遍历它:

代码语言:javascript
复制
let property: any = this.prozessPersonenzuordnungenForm.controls;
controlName.split('.').forEach(propertyKey => property = property[propertyKey]);

return property.hasError(errorName);
票数 0
EN

Stack Overflow用户

发布于 2022-07-13 11:17:49

很感谢你们的帮助,但我找到了一个更简单的方法!

这是我的工作解决方案:

代码语言:javascript
复制
public hasError = (controlName: string, deepControlName:string,  errorName: string) => {
    return this.prozessPersonenzuordnungenForm.controls[controlName].get(deepControlName)?.hasError(errorName);
  };

例如,我现在可以这样使用它:

代码语言:javascript
复制
<mat-error *ngIf="hasError('person', 'nameC', 'required')"> </mat-error>  

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72963645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档