Как удерживать моментальный снимок объекта из firebase с двусторонней привязкой данных

Я сталкиваюсь с тем, что не имеет смысла, и я даже не знаю, что искать, чтобы понять это. Таким образом, я решил, что я бы прямо спросил это здесь и надеюсь, что кто-то сможет указать, что происходит, и как мне следует решать эти проблемы.

У меня есть компонент editstudent, который заполняет форму на основе информации из firebase. Информация, которую я получаю, это "studentInfo", которая будет иметь много свойств, но пока она имеет только имя, фамилию, studentId, teacherId.

Я хочу активировать кнопку "Сохранить" только в том случае, если информация в форме была изменена по сравнению с той, что была в Firebase.

Это то, что делает мой код: -получить информацию о студентах из базы-огня - установить tempStudentInfo в студента во время инициализации. - разрешить пользователю изменять studentInfo, используя двустороннюю привязку данных. - в DOM измените кнопку на отключенную, если tempStudentInfo отличается от studentInfo.

Все это работает с моим кодом, однако tempStudentInfo всегда совпадает с studentInfo. Странно, я только когда-либо устанавливал tempStudentInfo в studentInfo в начале, но, похоже, он "обновляется" всякий раз, когда пользователь изменяет studentInfo, используя двустороннюю привязку данных.

 private studentFound: boolean = false;

      private studentInfo: studentInfo = {
        firstName: "",
        lastName: "",
        teacher: "",
        studentId: ""
      }
      private tempStudentInfo: studentInfo = {
        firstName: "",
        lastName: "",
        teacher: "",
        studentId: ""
      }

     ngOnInit() {
        this.studentFound = false;
        this.sub = this.route.params.subscribe(params => {
          this.id1 = params['id1'];
          this.id2 = params['id2'];
        });
        this.getStudents();
      }

      getStudents() {
        this.firebaseService.afAuth.authState.subscribe((val) => {
      if (val != null) {
        this.firebaseService.getStudents(val.uid).valueChanges().subscribe((list) => {
          for (var i = 0; i < list.length; i++) {
            if ((this.id1 == list[i].firstName) && (this.id2 == list[i].lastName)) {
              this.studentInfo = list[i];
              this.studentFound = true; 
            }
          }
        })
      }
    })
  }


  saveStudent(){
    console.log("student Saved");
    console.log("this is the student Info:",this.studentInfo);
    console.log("this is the tempstudentInfo:",this.tempStudentInfo);
  }

HTML:

<div class="container">
    <div class="row">
      <div class="title">
        Edit Student
      </div>
    </div>
    <div class="row">
      <div class="editStudentWrapper col-sm-6">
        <div class=" col-sm-12 card">
          <div class="card-container">
            <div class="row">
              <div class="col-sm-12">
                <div class="studentId">
                    Student ID: {{studentInfo.studentId}}
                </div>
                <div class="required text-right">
                  <font color="red">*</font>Required
                </div>
              </div>
            </div>
            <div class="seperator">
            </div>
            <form name="editStudentForm" #f="ngForm" autocomplete=off>
              <div class="row">
                <div class="col-sm-6">
                  <div class="input-title">First Name
                    <font color="red">*</font>
                  </div>
                  <input type="string" 
                  class="form-control" 
                  [ngClass]="{'is-invalid':studentFirstName.invalid&&studentFirstName.touched}" 
                  [(ngModel)]="studentInfo.firstName"
                    name="firstName" 
                    #studentFirstName="ngModel" 
                    autocomplete="new-password" 
                    autocomplete="off" 
                    pattern="[a-zA-Z ]*"
                    required>
                  <div *ngIf="studentFirstName.invalid && (studentFirstName.dirty || studentFirstName.touched)" class="row">
                    <div *ngIf='studentFirstName.errors.required' class="col-sm-12 text-danger">
                      <i class="fa fa-exclamation-circle" aria-hidden="true"></i>First name is required
                    </div>
                    <div *ngIf='studentFirstName.errors?.pattern' class="col-sm-12 text-danger">
                      <i class="fa fa-exclamation-circle" aria-hidden="true"></i> Invalid Format
                    </div>
                  </div>
                </div>
                <div class="col-sm-6">
                  <div class="input-title">Last Name
                    <font color="red">*</font>
                  </div>
                  <input type="text" 
                  class="form-control" 
                  [ngClass]="{'is-invalid':studentLastName.invalid&&studentLastName.touched}" 
                  [(ngModel)]="studentInfo.lastName"
                    #studentLastName="ngModel" 
                    name="lastName" 
                    autocomplete="new-password" 
                    autocomplete="off" 
                    pattern="[a-zA-Z ]*"
                    required>
                  <div *ngIf="studentLastName.invalid && (studentLastName.dirty || studentLastName.touched)" class="row">
                    <div *ngIf='studentLastName.errors.required' class="col-sm-12 text-danger">
                      <i class="fa fa-exclamation-circle" aria-hidden="true"></i>Last name is required
                    </div>
                    <div *ngIf='studentLastName.errors.pattern' class="col-sm-12 text-danger">
                      <i class="fa fa-exclamation-circle" aria-hidden="true"></i> Invalid Format
                    </div>
                  </div>
                </div>
              </div>
            </form>
          </div>
        </div>
        <div class="row" *ngIf="f.valid" >
          <div class="col-sm-12 mybutton">
            <div (click)="saveStudent()" class="submitButton" >
              <div class="buttonText">Save</div>
              <div class="buttonIcon">
              <i class="fa fa-floppy-o" aria-hidden="true"></i>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>

Извините за все написанное, я просто хотел пояснить, что я спрашиваю.

0 ответов

Другие вопросы по тегам