美文网首页@IT·互联网
angular 两表单控件值双向关联

angular 两表单控件值双向关联

作者: 云上笔记 | 来源:发表于2021-04-20 19:22 被阅读0次

业务场景:

改变 model A,model B 的值改变;
改变 model B,model A 的值也改变。

例如:buy/selllong/short字段分别有两个下拉选项, buy/sell 值为buy 时,long/short 值自动改为 long, 反之亦然

ngModel联动.gif
看到这个效果,首先想到的是不是用两个ngModelChange事件直接改变另一项的值
// html
<lable>buy/sell</label>
<nz-select formControlName="buy_sell" (ngModelChange)="chooseBuySell($event)">
    <nz-option nzLabel="BUY" nzValue="BUY"></nz-option>
    <nz-option nzLabel="SELL" nzValue="SELL"></nz-option>
</nz-select>

<lable>long/short</label>
<nz-select formControlName="long_short" (ngModelChange)="chooseLongShort($event)">
    <nz-option nzLabel="LONG" nzValue="LONG"></nz-option>
    <nz-option nzLabel="SHORT" nzValue="SHORT"></nz-option>
</nz-select>
  /**
   * components
   * buy/sell 选择 buy 时,long/short 自动选择long,反之亦然
   */
  public chooseBuySell(val) {
    const res = val.toLowerCase();
    if (res === 'buy') {
      this.detailForm.get('long_short').patchValue('LONG');
    } else {
      this.detailForm.get('long_short').patchValue('SHORT');
    }
  }

  public chooseLongShort(val) {
    const res = val.toLowerCase();
    if (res === 'long') {
      this.detailForm.get('buy_sell').patchValue('BUY');
    } else {
      this.detailForm.get('buy_sell').patchValue('SELL');
    }
  }

运行代码,发现报错

error.png
这是因为,当你改变其中一项时,触发了当前项的ngModelChange事件,而该事件中的patchValue给另一个表单项赋值的时候,另一项ngModel的值已经改变,从而触发了另一项的ngModelChange事件,如此就会导致两个ngModelChange事件不断被触发,从而爆栈 图片.png

那么,有什么办法可以解决这个问题呢?
通过查看 FormControl patchValue()函数的源码,可以发现该函数提供了一个emitEvent参数,如果设为 true或未提供(默认),则当控件值变化时, statusChangesvalueChanges这两个 Observable 都会以最近的状态和值发出事件。 如果为 false,则不会发出事件。
因此我们通过设置emitEvent: false 来延迟更新控件的值

图片.png

如下更改代码后,可以实现该效果

// html
<lable>buy/sell</label>
<nz-select formControlName="buy_sell" (ngModelChange)="chooseBuySell($event)">
    <nz-option nzLabel="BUY" nzValue="BUY"></nz-option>
    <nz-option nzLabel="SELL" nzValue="SELL"></nz-option>
</nz-select>

<lable>long/short</label>
<nz-select [ngModel]="detailForm.value.long_short" 
           [ngModelOptions]="{standalone: true}" 
           (ngModelChange)="chooseLongShort($event)">
      <nz-option nzLabel="LONG" nzValue="LONG"></nz-option>
      <nz-option nzLabel="SHORT" nzValue="SHORT"></nz-option>
</nz-select>
  /**
   * components
   * buy/sell 选择 buy 时,long/short 自动选择long,反之亦然
   */
  public chooseBuySell(val) {
    const res = val.toLowerCase();
    if (res === 'buy') {
      this.detailForm.get('long_short').patchValue('LONG', { emitEvent: false });
    } else {
      this.detailForm.get('long_short').patchValue('SHORT', { emitEvent: false });
    }
  }

  public chooseLongShort(val) {
    const res = val.toLowerCase();
    this.detailForm.get('long_short').patchValue(val, { emitEvent: false });
    if (res === 'long') {
      this.detailForm.get('buy_sell').patchValue('BUY');
    } else {
      this.detailForm.get('buy_sell').patchValue('SELL');
    }
  }

相关文章

  • angular 两表单控件值双向关联

    业务场景: 改变 model A,model B 的值改变;改变 model B,model A 的值也改变。 例...

  • 氚云学习之旅-关联表单及自定义SQL(一)

    氚云的关联表单控件分为两中,一种是“关联表单”,另一种是“关联表单多选”。 关联表单使用时比较简单,选择好关联表单...

  • Angular框架中FormArray中嵌套FormGroup

    Angular中FormGroup是用来管理一组表单控件的,响应式表单使用FormArray来动态的管理表单控件,...

  • Angular5踩坑总结

    表单双向绑定1:做双向绑定时,如果遇见Angular: Can't bind to 'ngModel' since...

  • Vue - 双向数据绑定方式

    对表单控件: 双向绑定了 的value到Vue的data。

  • vue.js模板语法demo

    html & css js 注:v-model用在表单控件上的,用于实现双向数据绑定,所以如果你用在除了表单控件以...

  • 2017-07-14

    vue中,表单组件的数据双向绑定,不仅跟表单控件类型有关,还跟绑定的数据类型有关。 看来是表单控件类型去决定数据类...

  • VUE指令

    v-model:数据双向绑定 在表单控件或者组件上创建双向绑定。input、select、textare、comp...

  • Vue - 指令 - (v-model)

    v-model预期:随着表单控件类型不同而不同。限制: 修饰符: 使用方法:在表单控件或者组件上创建双向绑定。细节...

  • 学习Vue(表单)

    表单 以用 v-model 指令在表单控件元素上创建双向数据绑定,v-model 会根据控件类型自动选取正确的方法...

网友评论

    本文标题:angular 两表单控件值双向关联

    本文链接:https://www.haomeiwen.com/subject/bdzslltx.html