Почему я не могу получить доступ к объекту, который был установлен на ngOnInit - PullRequest
0 голосов
/ 11 сентября 2018

В последнее время столкнулся с несколькими проблемами и удивляюсь, почему я не могу получить доступ к объекту, который был установлен в функции ngOnInit для более поздних целей, как в другой функции?

Я хочу получить доступ и использовать this.appointmentDetailId в моей функции cancelAppointment(), но это undefined. Надеюсь, кто-то может помочь. Спасибо.

Вот мой код:

export class AppointmentDetailComponent implements OnInit {
  id: any;
  appointmentDetailId: any;
  appointmentDetail$: Observable<AppointmentDetails>;
  appointmentDetail: AppointmentDetails;
  pageTitle = 'Some Default Title Maybe';

  constructor(
    private route: ActivatedRoute,
    private title: Title,
    private apiService: APIService
  ) {
    this.appointmentDetailId = this.id;
    console.log(this.appointmentDetailId);
  }

  ngOnInit() {
    this.route.paramMap
      .pipe(
        tap((params: ParamMap) => {
          this.id = params.get('id');
          // Or this.id = +params.get('id'); to coerce to type number maybe
          this.pageTitle = 'Termin Details: ' + this.id;
          this.title.setTitle(this.pageTitle);
        }),
        switchMap(() => this.apiService.getAppointmentDetailsById(this.id))
      )
      .subscribe((data: AppointmentDetails) => {
        this.appointmentDetail = data;
        console.log(this.appointmentDetail);
      });
  }

  cancelAppointment() {
    console.log(this.appointmentDetailId);
    this.apiService.cancelUserAppointment(this.appointmentDetailId);
  }
}

1 Ответ

0 голосов
/ 11 сентября 2018

В конструкторе вы устанавливаете this.appointmentDetailId = this.id, который устанавливает начальное значение this.id (возможно, undefined);

Позже вы установите this.id = params.get('id'), но это не изменит this.appointmentDetailId, потому что это два разных объекта.


Если вы хотите, чтобы this.appointmentDetailId всегда совпадал с this.id, вам следует сделать его простой оберткой, а не собственным объектом.

export class AppointmentDetailComponent implements OnInit {
  id: any;
  get appointmentDetailId() {
    return this.id;
  }
  set appointmentDetailId(value: any) {
    this.id = value;
  }

  // Other code
}

Используя пользовательский метод get и set, вы все равно можете получить доступ к this.appointmentDetailId, как если бы это было его собственное поле - но на самом деле оно будет таким же, как this.id. Теперь любые изменения в любом поле всегда будут синхронизированы.

// Always true
this.appointmentDetailId === this.id

this.appointmentDetailId = 123;
this.appointmentDetailId === 123; // True
this.id === 123; // True;

this.id = "Test";
this.appointmentDetailId === "Test"; // True
this.id === "Test"; // True

В качестве альтернативы, если вы можете просто опустить метод set и тогда вы просто сможете получить доступ к тому же значению, но вы не сможете его изменить.

// Always true
this.appointmentDetailId === this.id

this.appointmentDetailId = 123; // Error

this.id = "Test";
this.appointmentDetailId === "Test"; // True
this.id === "Test"; // True
...