【问题标题】:Observables for Angular-formsAngular 形式的 Observables
【发布时间】:2019-01-02 02:34:22
【问题描述】:

我的网站上有一个表格。(person.firstName、lastName、DOB、Gender、Citizenship 等...)。我的问题是如何观察整个形式的变化并从观察中得到两件事:

  • formControl 及其当前状态
  • 已处理 formControl 的当前值

    字首 {{可用前缀}}

          <div class="col">
            <label for="firstName">First Name<span style="color: red"> *</span> </label>
            <input formControlName="party.firstName" type="text" autocomplete="off" id="firstName"/>
          </div>
    
          <div class="col">
            <label for="middleName">Middle Name</label>
            <input formControlName="party.middleName" type="text" autocomplete="off" id="middleName" maxlength="1" />
          </div>
    
          <div class="col">
            <label for="lastName">Last Name<span style="color: red"> *</span> </label>
            <input formControlName="party.lastName" type="text" autocomplete="off" id="lastName"/>
          </div>
    
          <div class="col">
            <label for="suffix">Suffix</label>
            <select formControlName="party.suffix" id="suffix">
              <option [value]="availableSuffix" *ngFor="let availableSuffix of availableSuffixes">{{availableSuffix}}
              </option>
            </select>
          </div>
        </div>
      </form>
    

感谢您的帮助

【问题讨论】:

  • 你是什么意思? formControl 及其当前状态
  • 我的意思是“脏”或“原始”、“有效”或“无效”

标签: angular angular-forms angular-observable


【解决方案1】:

valueChanges observable 总是会推送表单的新值。

为了跟踪表单的状态,有几个属性:

status 控件的验证状态。有四种可能的验证状态值 (VALID , INVALID , PENDING, DISABLED)。

还有另一个 observable 可以跟踪状态变化 statusChanges

其他用于跟踪表单状态的只读布尔属性:

(valid , invalid , pending , disabled , enabled , pristine , dirty , touched , untouched)

你可以通过这个技巧跟踪旧的 valeu 状态

  public form:FormGroup;
  oldValue:any;
  constructor (fb:FormBuilder) { 
     this.form = fb.group({
       name:[],
       lastName:[]
     });

     this.form.valueChanges.subscribe(newValue => { 
        console.log('old value',this.oldValue);
        this.oldValue = newValue;
        console.log('new form value',newValue);
        console.log('state ', this.form.status);
        console.log('pristine ',this.form.pristine);
        console.log('dirty ',this.form.dirty);
        console.log('touched ',this.form.touched);
     });
  }

stackblitz example

AbstractControl

【讨论】:

    【解决方案2】:

    一旦您的表单被创建(通过 FormBuilder),只需这样写:

    this.fmdForm.valueChanges.subscribe(formValue => { console.log(formValue); });
    

    【讨论】:

    • 谢谢,但是我怎样才能为这个更改的值获取 formControl?
    • formValue 包含所有表单控件。使用formValue.party.suffix 访问它们。
    • 对于状态,老办法:this.fmdForm.get('party.suffix').valid
    • 我试过你的答案。 formValue 只包含没有 formControl 状态的值
    • 状态不绑定变化,状态绑定到表单。我在您之前发表了评论,告诉您如何获取状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多