首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理“表达式已被选中错误后更改”的特殊情况

问如何处理“表达式已被选中错误后更改”的特殊情况
EN

Stack Overflow用户
提问于 2017-10-27 19:27:56
回答 1查看 607关注 0票数 3

对于这个特定的错误,以及一些应用于它所处理的具体实现的解决方案,有很多值得阅读的地方。我不知道它将如何适用于我的。根据FormGroup是否有效,我正在更改材料扩展面板的背景色。我在一些FormGroups上有一些复选框表单控件,可以切换其他文本字段的可见性,以及它们的验证器。直到最近(也许是从4.4.3更新到4.4.6),这还不错。但是,现在,在以前有效的窗体组中切换控件上的验证,会在检查错误后抛出表达式更改。

代码语言:javascript
复制
    <md-expansion-panel [expanded]="step===1" (opened)="setStep(1)" [ngStyle]="{'background': changeForm.get('changeOverviewFG').valid && changeForm.get('changeOverviewFG').touched ?'#cffccf' :'#fff'}">
    <div class="row">
        <div class="col-xs-12 col-sm-12">
            <h4>Type of Change</h4>
        </div>
        <div class="col-xs-12 col-sm-6">
            <input type="checkbox" formControlName="srvCheck" (click)="setValidator(changeForm.get('changeOverviewFG.srvCheck'),[changeForm.get('changeOverviewFG.srvPackage')])">SRV Package
        </div>
   </div>
   <div class="row">
         <div *ngIf="changeForm.get('changeOverviewFG.srvCheck').value">
              <div class="form-group" [ngClass]="{'td-group-error': displayMessage.srvPackage }">
                    <textarea class="form-control" rows="2" formControlName="srvPackage" placeholder="Description/Name if known" style="width:100%"> </textarea>
                    <div class="error-block" *ngIf="displayMessage.srvPackage" role="alert" style="color: #ae0101">
                          <strong>!</strong> {{displayMessage.srvPackage}}
                    </div>
              </div>
         </div>
   </div>

因此,我在复选框上调用的set验证器调用组件类中的以下函数

代码语言:javascript
复制
setValidator(c: FormControl, d: [FormControl]) {
    if (!c.value) {
      d.forEach(element => {
        element.setValidators(Validators.required);
      });

    } else {
      d.forEach(element => {
        element.clearValidators();
      });
    }
  }

本节的错误发生在ngStyle的第一行,该行根据formGroup是否有效而更改背景色。有人能告诉我如何正确处理它是如何检查更改的吗?

我试图理解的引用之一是this one,但我不知道它将如何与模板中有关ngStyle的实例一起工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-31 13:51:57

最后我弄明白了。我的问题是双重的。一个是我没有正确地清除验证器,我在clearValidators()之后调用clearValidators()进行了补救,如下所示

代码语言:javascript
复制
setValidator(c: FormControl, d: [FormControl]) {
if (!c.value) {
  d.forEach(element => {
    element.setValidators(Validators.required);
  });

} else {
  d.forEach(element => {
    element.clearValidators();
    element.updateValueAndValidity();
  });
}
}

其次,模板中的ngStyle属性和逻辑会导致检查错误后的表达式发生变化。我将逻辑转移到ngAfterContentChecked lifecyle钩子中,如下所示。

代码语言:javascript
复制
  ngAfterContentChecked(): void {
if (this.changeForm.get('changeOverviewFG').valid && this.changeForm.get('changeOverviewFG').touched) {
  this.changeOverviewColor = '#cffccf';
} else {
  this.changeOverviewColor = '#fff';
}
}

然后将属性标记更改为模板中的以下内容

代码语言:javascript
复制
<md-expansion-panel class="changeOverviewFGpanel" [expanded]="step===1" (opened)="setStep(1)" [style.background]="changeOverviewColor">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46982174

复制
相关文章

相似问题

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