【问题标题】:Dynamically change the color of form fields using Angular reactive forms使用 Angular 响应式表单动态更改表单字段的颜色
【发布时间】:2020-09-23 17:45:07
【问题描述】:

当用户使用 setValue() 为这些字段动态设置表单值时,如何仅将少数字段(名字和电子邮件)的 Angular 反应式表单字段文本颜色更改为“红色”。还需要将表单字段(名字和电子邮件)的颜色更改为“绿色”,以防用户尝试修改/交互。

但不应更改其他表单字段的颜色。

我在以下链接中创建了 stackblitz

reactive form updated code in stackblitz

我已经创建了这样的表单,

<form name="form" [formGroup]="form">
          <div class="form-group">
            <label for="firstName">First Name</label>
            <input type="text"  class="form-control" formControlName="firstName" [style.color]="getColor('firstName')" (input)="inputChanged($event)"/>
          </div>

          <div class="form-group">
            <label for="email">Email</label>
            <input type="text" class="form-control" formControlName="email" [style.color]="getColor('email')" (input)="inputChanged($event)" />
          </div>
          <div class="form-group">
            <label for="phone">phone</label>
            <input type="text" class="form-control" formControlName="phone" [style.color]="getColor('phone')" (input)="inputChanged($event)" />
          </div>

          <button class="btn btn-primary" (click)="setFormm()">click here</button>
        </form>

组件

@Component({
  selector: "app-formreactive",
  templateUrl: "./formreactive.component.html",
  styleUrls: ["./formreactive.component.css"]
})
export class FormreactiveComponent {
  form = new FormGroup({
    firstName: new FormControl(""),
    email: new FormControl("")
  });

  getColor(frmctrl, color) {

  }

  inputChanged = (e: any) => {

  };

  setFormm = () => {
    this.form.controls['firstName'].setValue('vishnu');
    this.form.controls["email"].setValue("vishnu@hminds.com");
  };

【问题讨论】:

    标签: angular angular-reactive-forms


    【解决方案1】:

    您可以使用 ng-pristine 和 ng-dirty 来“玩”它。见the docs。所以,在你的 .css 中

    input.ng-pristine
    {
      color:red;
    }
    input.ng-dirty
    {
      color:green
    }
    

    在你的函数 setForm 中将所有控件标记为 Pristine

    setForm = () => {
        ....
        this.form.markAsPristine({ onlySelf:false }) 
      };
    

    注意:如果输入为空,您可以给出黑色光标

    <input type="text"  class="form-control" formControlName="firstName" 
            [style.color]="!form.value.firstName?'black':null" />
    
     //and 
     <input type="text" class="form-control" formControlName="email" 
            [style.color]="!form.value.email?'black':null" />
    

    stackblitz

    更新如果我们希望这仅发生在某些输入中,我们可以向输入添加一个类(例如,称为“advice”)class="form-control advice"

    我们的 .css 变成了

    input.ng-pristine.advice
    {
      color:red;
    }
    input.ng-dirty.advice
    {
      color:green
    }
    

    我们的输入像

    <input type="text"  class="form-control advice" formControlName="firstName" 
                    [style.color]="!form.value.firstName?'black':null" />
    <input type="text" class="form-control advice" formControlName="email" 
                   [style.color]="!form.value.email?'black':null" />
    

    我更新了堆栈闪电战

    【讨论】:

    • 感谢您的快速回复。它按预期工作,但假设我有另一个字段(电话号码)并且不想为该字段应用样式,即仅对名字和电子邮件应用样式。你能帮我解决这个问题吗?我已经更新了 stackblitz 中的代码
    • 您始终可以在输入中添加一个类,请参阅我的更新答案
    • 伟大的@Eliseo,它的工作就像魅力。昨天相同的表单转换为反应式动态表单,并且无法添加相同的功能。你能帮忙吗? stackblitz 链接:dynamic reactive form
    • 只需将css添加到dinamic-form.component(您可以在“style”中执行)并仅在您需要类建议的元素中添加属性“advice:true”。在输入添加 [class.advice]="prop.advice",我在 stackblitz.com/edit/angular-6-reactive-forms-zyidmb?file=src/… 中分叉了你的 stackblitz
    猜你喜欢
    • 2020-05-13
    • 2017-06-06
    • 2018-12-25
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-01-09
    相关资源
    最近更新 更多