Angular 2 Reactive Forms 问题如何以角度方式而不是 jquery 方式进行

Posted

技术标签:

【中文标题】Angular 2 Reactive Forms 问题如何以角度方式而不是 jquery 方式进行【英文标题】:Angular 2 Reactive Forms issue how to do in angular way not jquery way 【发布时间】:2018-09-28 19:41:09 【问题描述】:

我使用带有 Typescript 的 Angular 2 Reactive Forms。 我有一个这样的模板:

<form [formGroup]="form">
    <div class="M">
        <div class="X">
            <!-- I dont want to put (change)="onChanged()" on every inputs-->
            <input class="A" formControlName="MXA" /> 
            <input class="B"  formControlName="MXB" />
            <input class="C" formControlName="MXC" />
        </div>
        <div class="Y">
            <input class="A" formControlName="MYA" />
            <input class="B" formControlName="MYB" />
            <input class="C" formControlName="MYC" />
        </div>
    </div>
    <div class="N">
        <div class="X">
            <input class="A" formControlName="NXA" />
            <input class="B" formControlName="NXB" />
            <input class="C" formControlName="NXC" />
        </div>
        <div class="Y">
            <input class="A" formControlName="NYA" />
            <input class="B" formControlName="NYB" />
            <input class="C" formControlName="NYC" />
        </div>
    </div>
</form>

和组件类:

export class MyCompoenent 

  public form: FormGroup;

  onInit() 
    this.form = new FormGroup(
      MXA: new FormControl(),
      MXB: new FormControl(),
      MXC: new FormControl(),
      MYA: new FormControl(),
      MYB: new FormControl(),
      MYC: new FormControl(),
      NXA: new FormControl(),
      NXB: new FormControl(),
      NXC: new FormControl(),
      NYA: new FormControl(),
      NYB: new FormControl(),
      NYC: new FormControl(),
    );

    this.form.valueChanges.subscribe((p) => 
      /* I dont't know which input has been changed here */
    );
    this.form.get('MXA').valueChanges.subscribe((p) => 
      /* I dont't want to subscribe to every individual input like this, its not good solution when there is too many inputs */
    );

  


我想要的是:

1.三个输入有四个div,三个输入的关系是A+B=C,每当其中一个输入发生变化时,都要检查同一个div是否有另一个输入有值,如果有,则计算第三个输入。

例如输入M => X => A的值为2,则用户在M => X => B中输入3,则M => X => C自动设置为5

2。如果输入发生变化,它应该更新在 SAME 祖父 div 中具有相同类的另一个输入。

例如输入 M => X => A 的值设置为 5,则应将输入 M => Y => A 设置为 5

以 jquery 方式思考很容易,因为我可以对所有输入进行一次绑定,并且我可以知道哪个输入触发了更改事件,然后我可以从触发的输入在 DOM 中导航。

但我想知道如何以 Angular 的方式正确地做到这一点。 this.form.valueChanges() 不显示哪个输入已更改,并且我不喜欢单独订阅每个输入,不喜欢在角度模板的每个输入中放置一些绑定,因为如果输入太多,我需要做很多工作,并且不想使用 getElementsByClassName 之类的“jquery 方式”,有什么想法吗?

提前致谢!

【问题讨论】:

【参考方案1】:

您可以在每个输入中定义 formControlName,然后在其中任何一个更改时检查它们。formControl 的值您可能会得到这样的结果

this.form.get("formControleName");

或者你可以定义 formControle 然后订阅它

filterName = new FormControl(null);
constructor()
  this.filterName.valueChanges.subscribe(value => 
    if (value) 
  

还有其他选择,但我不会推荐。

  <input #inputAX (change)="aChanged(inputBX)"/> 
  <input #inputBX (change)="bChanged(inputAX)"/>

然后检查元素是否有值

  aChanged(element) 
  if(element.value)
  

  bChanged(element) 
  if(element.value)
  

【讨论】:

是的,我在每个输入中都有 formControlName,您如何订阅值更改以及如何知道哪个输入发生更改?

以上是关于Angular 2 Reactive Forms 问题如何以角度方式而不是 jquery 方式进行的主要内容,如果未能解决你的问题,请参考以下文章

Angular Reactive Forms 重置值

Angular Reactive forms : change vs valueChanges

Angular Reactive Forms,patchValue 不起作用,嵌套表单

Angular Reactive Forms vs ngModel,哪个性能更好? [关闭]

如何为Angular Reactive Forms创建自定义验证器

Angular 9 Reactive Forms:使用 trackBy 时复选框未更新