Ионная форма вызывает ngOnInit несколько раз - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть форма, которая отображает существующие данные из Firestore, а затем при изменении данные обновляются.Проблема в том, что ngOnInit, кажется, вызывается несколько раз, а затем вызывается функция saveInspectionChanges ().Я не уверен, почему эти функции активируются, когда на странице еще нет изменений.Когда форма открыта, поля непрерывно мигают, а затем, когда форма закрыта и нулевые данные сохранены.

detail.page.ts

  public inspectionID: string = this.route.snapshot.paramMap.get('id');
  public inspection: any;
  public Customer: any;
  public Site: any;
  public Tank: any;

  inspectionDetailsForm: FormGroup;

  public Users: any;

  constructor(
    private firestoreService: FirestoreService,
    private route: ActivatedRoute,
    private alertController: AlertController,
    private router: Router,
    formBuilder: FormBuilder, public firestore: AngularFirestore,
  ) {
    this.inspectionDetailsForm = formBuilder.group({
      Date: [''],
      InspectionType: [''],
      Status: [''],
    });
  }

  ngOnInit() {
    this.inspection = this.firestoreService.getInspectionDetail(this.inspectionID).valueChanges();
    this.inspection.subscribe(inspection => {
      this.inspectionDetailsForm.patchValue(inspection);
    });
  }

  updateInspection(data: any) {
    return this.firestore.collection('inspectionList').doc(this.inspectionID)
      .update(data);
  }

  saveInspectionChanges() {
    if (this.inspectionDetailsForm.status !== 'VALID') {
      console.log('form is not valid, cannot save to database');
      return;
    }
    console.log('form is valid, saving to database');
    const data = this.inspectionDetailsForm.value;
    this.updateInspection(data);
  }

detail.page.html

<ion-content>
  <form [formGroup]="inspectionDetailsForm" novalidate>
    <ion-list lines="full" class="ion-no-margin ion-no-padding">
        <ion-item>
          <ion-label position="stacked">Date</ion-label>
          <ion-input formControlName="Date" type="date"></ion-input>  
        </ion-item>
        <ion-item>
          <ion-label position="stacked">Inspection Type</ion-label>
          <ion-select formControlName="InspectionType" okText="OK" cancelText="Dismiss" (ionChange)="saveInspectionChanges()">
            <ion-select-option value="API 653 Internal">API 653 Internal</ion-select-option>
            <ion-select-option value="API 653 External">API 653 External</ion-select-option>
            <ion-select-option value="STI-SP001">STI SP-001</ion-select-option>
          </ion-select>
        </ion-item>
        <ion-item>
          <ion-label position="stacked">Status</ion-label>
          <ion-select formControlName="Status" okText="OK" cancelText="Dismiss" (ionChange)="saveInspectionChanges()">
            <ion-select-option value="Scheduled">Scheduled</ion-select-option>
            <ion-select-option value="Preliminary Report">Preliminary Report</ion-select-option>
            <ion-select-option value="Report not complete">Report not complete</ion-select-option>
            <ion-select-option value="Report complete">Report complete</ion-select-option>
          </ion-select>
        </ion-item>
    </ion-list>
  </form>

</ion-content>

деталь.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';

import { IonicModule } from '@ionic/angular';

import { DetailPage } from './detail.page';

const routes: Routes = [
  {
    path: '',
    component: DetailPage
  }
];

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule,
    RouterModule.forChild(routes),
    ReactiveFormsModule,
  ],
  declarations: [DetailPage]
})
export class DetailPageModule {}
...