Вы связываете метод addNewAppointment
, так что каждый раз, когда он вызывается, контекст выполнения (т. Е. Значение this
) будет Appointments
экземпляром.
Это будет гарантировать, что независимо от того, как вызывается метод, вы сможете получить доступ к this.state.appointments
и вызвать this.setState
внутри метода addNewAppointment
.
Но эта привязка не гарантирует, что каждый раз, когда вы пытаетесь вызвать Метод с this.addNewAppointment
, значение this
будет экземпляром компонента. В представленном случае, когда вызов $.ajax
создает новый контекст выполнения, при вызове:
$.ajax({
url: '/appointments',
type: "POST",
data: appointment,
contentType: 'application/json',
success: function(data){
this.addNewAppointment(data)
}
});
контекст выполнения (значение this
) не является экземпляром компонента. Чтобы решить эту проблему, вы можете сделать две вещи:
- Определить обратный вызов успеха как функцию стрелки, которая наследует родительский контекст выполнения:
$.ajax({
url: '/appointments',
type: "POST",
data: appointment,
contentType: 'application/json',
success: data => {
this.addNewAppointment(data)
}
});
Сохраните контекст выполнения, когда вы знаете, что это экземпляр компонента, а затем используйте эту ссылку:
handleFormSubmit() {
const self = this;
const appointment = JSON.stringify({
title: this.state.title,
appointment_time: this.state.appointment_time
});
$.ajax({
url: '/appointments',
type: "POST",
data: appointment,
contentType: 'application/json',
success: function(data){
self.addNewAppointment(data)
}
});
}