2015-11-21 7 views
0

У меня небольшая проблема с React (все еще нова к ней). У меня есть массив результатов. Эти результаты имеют вложенные заказы, также в массиве, а последние - то, что я манипулирую.Splice удаляет только последний элемент в массиве

Когда пользователь создает бронирование, все идет так, как ожидалось - findIndex получает правильный элемент результата и соответствующим образом изменяет его массив заявок.

Однако, когда я хочу «Unbook», он находит только последний результат в массиве, и findIndex всегда -1 (так что я даже не добрался до Bookings части, потому что индекс результата я получаю неправильно).

Код аналогичен, у моих элементов все есть уникальные ключи, и я не понимаю, что может быть проблемой (используя Alt как реализацию Flux)?

Вот что происходит на Create:

onCreateBookingSuccess(data) { 
    let resultIndex = this.results.findIndex((result) => result.id === data.id); 
    this.results.update(resultIndex, (result) => result.bookings.push(data)); 
    toastr.info('Booked! User will receive notification.'); 
    } 

И на удаление:

onDestroyBookingSuccess(data) { 
    let resultIndex = this.results.findIndex((result) => result.id === data.id); 
    var myBooking; 
    this.results.map((result) => { 
     myBooking = result.bookings.findIndex((booking) => booking.id === data.booking); 
    }); 
    this.results.update(resultIndex, (result) => result.bookings.splice(myBooking,1)); 
    toastr.warning('Unbooked! User will receive notification.'); 
    } 

Мой объект:

<Result key={result.id} id={result.id} bookings={result.bookings} /> 

Как я уже говорил, первая операция идет по плану, все изменяется так, как должно. Проблема со вторым оператором начинается с самого начала, когда resultIndex возвращает -1.

+0

- это данные, переданные правильно в Destroy? – luanped

+0

@luanped Должно быть правильно, да. Я вижу возвращение, которое я хочу увидеть в панели «Сеть» Chrome с данными об уничтоженной записи. Вот метод из действий: 'deleteBookingFor (bookingId) { $ .ajax ({ URL: '/ бронирование /' + bookingId, тип: 'DELETE' }) .done ((данные) => { this.actions.destroyBookingSuccess (data); }) .fail ((jqXhr) => { this.actions.destroyBookingFail (jqXhr); }); } ' (извините, код формата комментариев довольно плохо), и метод Ajax является методом REST, поэтому уничтожение DB отлично работает. – MindRave

ответ

0

Проблема, кажется, здесь:

var myBooking; 
this.results.map((result) => { 
    myBooking = result.bookings.findIndex((booking) => booking.id === data.booking); 
}); 

Вы всегда присваивание myBooking, даже если индекс не найден (-1) после того, как уже нашли, так что это эквивалентно this.results.last().bookings.findIndex(...). На самом деле вы только хотите, чтобы получить значение (первая?), Что это не -1:

var myBooking = this.results.map((result) => { 
    myBooking = result.bookings.findIndex((booking) => booking.id === data.booking); 
}).find((index) => index != -1); 

Кроме того, рассмотреть вопрос о переименовании myBooking лучше указать это индекс, а не фактический отчет.

+0

Спасибо за ответ! Может быть, но проблема возникает раньше этого. 'Let resultIndex = this.results.findIndex ((result) => result.id === data.id);' в действии onDestroyBookingSuccess - тот, который возвращает «-1», в то время как тот же код отлично работает в действие onCreateBookingSuccess - вот почему это меня озадачивает ... – MindRave

Смежные вопросы