【问题标题】:Angular 2, Unable to validate form after populating it from firebaseAngular 2,从firebase填充表单后无法验证表单
【发布时间】:2017-06-21 13:36:32
【问题描述】:

我有一个 EditAssignment 表单,我需要用数据库中的现有值填充它,然后验证表单。首先,我像这样从 firebase 检索表单值。

 this.assignment = this._db.object('/assignments-detail/' + asnDetailKey);

然后我将表单值存储在类变量(_assignment)中。

 this.assignment.subscribe(asnDetails => {
  this._assignment = asnDetails;
});

然后我像这样使用 _assignment 填充表单。

 <form [formGroup]="form">
   <div class="form-group">
      <label for="subject">Assignment Subject</label>
      <input type="text" class="form-control" id="subject" formControlName="subject" [value]="_assignment?.subject">
    <div class="alert alert-danger" *ngIf="form.controls['subject'].touched && form.controls['subject'].hasError('required')">
      Please enter assignment subject.
    </div>
  </div>
  <div class="form-group">
     <label for="dueDate">Due Date</label>
     <input type="date" class="form-control" required="required" id="dueDate" formControlName="dueDate" [min]="today" [value]="_assignment?.dueDate">
   <div class="alert alert-danger" *ngIf="form.controls['dueDate'].touched && form.controls['dueDate'].value==' | async'">
     Please enter a valid due date.
   </div>
  </div>
   <button type="button" class="btn btn-primary" (click)="onUpdate()" [disabled]="!form.valid">Edit Assignment</button>
 </form>

最后,我使用从 ngOnInit 调用的 validate() 方法在 typescript 文件中进行验证。

 validate() {
  this.form = this._fb.group({
  subject: ['', Validators.compose([Validators.required])],
  dueDate: ['']
});

我能够成功地从数据库中检索值并填充表单,但它没有验证。例如,当我单击主题文本框然后单击退出时,即使文本框不为空,它也会显示错误消息 please enter assignment subject。该按钮也被禁用。

【问题讨论】:

  • 您应该在组件中填充控件,如下所示:dueDate: ['someValue'],而不是在 HTML 中使用值 attribute。此外,HTML 中的required="required" 验证也应该放在组件中(Validators.required)。另请注意,您在此处遇到语法错误 (==' | async'):...&amp;&amp; form.controls['dueDate'].value==' | async'"&gt;
  • 但是如何在组件内动态填充表单控件?
  • 在订阅中调用该函数:this.validate(asnDetails); 并在 vaidate 中调用:validate(data) { // fill form with the data values }

标签: forms angular validation firebase


【解决方案1】:

不建议同时使用templete-driven formmodel-driven form

对于ReactiveForm,你应该通过

来初始化元素
this.form = this._fb.group({
  subject: ['init value', Validators.compose([Validators.required])],   // init here
  ...
});

根据您的情况(更改主题值),您不应该使用[value](用于模板驱动的表单),而是使用patchValue

this.assignment.subscribe(asnDetails => {
  this._assignment = asnDetails;
  if (this._assignment.subject) {
    this.form.get('subject').patchValue(this._assignment.subject);
  }
});

【讨论】:

  • 验证工作正常。非常感谢 Pengyy :)
  • 这里好像有问题。当我第一次访问链接时,代码似乎工作正常,但之后如果我访问其他链接并返回,那么它不会修补值以形成控件。
  • @PR7 它应该一直有效。确保每次都执行patchValue
  • setInputValues() { this.assignment.subscribe(asnDetails => { this._assignment = asnDetails; this.form.get('course').patchValue(this._assignment.course); 这个。 form.get('batch').patchValue(this._assignment.batch); this.form.get('subject').patchValue(this._assignment.subject); this.form.get('name').patchValue (this._assignment.AsnName);this.form.get('description').patchValue(this._assignment.AsnDesc);this.form.get('dueDate').patchValue(this._assignment.dueDate);this. batches = this._db.list('/batches/' + this._assignment.course); }); }
  • 我就是这样做的,我也控制台记录 this._assignment 并显示所有值,但下面的语句没有修补值以形成控制
【解决方案2】:
    ngOnInit() {
          this.form = this._fb.group({
          subject:['', [Validators.required]],
          dueDate: [''] 
        }

否则,你应该触发 ngOnInit 中的函数

  ngOnInit() {
               validate();
            }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2019-04-18
  • 2016-11-28
  • 2016-08-19
相关资源
最近更新 更多