спасибо за полный и подробный вопрос!Я собираюсь попытаться ответить, но у меня нет 100% информации, которая мне понадобилась бы, чтобы быть уверенной, что это ответит на проблему для вашей конкретной ситуации, но, надеюсь, она все еще будет полезна, и вы сможете извлечь из нее то, что вам нужно,
Общая проблема, о которой вы упомянули, заключается в том, что данные не полностью загружаются при обновлении, вероятно, вызвано тем, что ответ API не содержит всей необходимой информации.Если вы проверите Web Dev Tools на Chrome, вы сможете убедиться, что это так.
Если вы откроете инструменты разработки, откроете вкладку сети и найдете запрос, который загружает ваши данные, тогда мы можем это проверить.Я не знаю, насколько вы знакомы с инструментами разработки, но если вы откроете их и обновите страницу, вы увидите все запросы, сделанные браузером.Затем вы можете выполнить фильтрацию по XHR, чтобы найти запрос API:
После этого вы сможете щелкнуть соответствующий запрос и использовать вкладку preview для изучения доступных данных:
Просматривая эти данные, вы сможете проверить, установлены ли необходимые отношения, и вытакже сможет, если правильные данные также включены в раздел includes
ответа JSON: API.Пример того, как это должно выглядеть, вы можете найти на странице примеров официальной JSON: документация API
Мы потратили немного времени, пытаясь воспроизвести вашу проблему, используя Мираж , чтобы мы могли показать точную проблему, с которой вы столкнулись.Это небольшой игрушечный пример, но он повторяет ошибку и показывает, как описанный выше метод решает проблему.
Сначала я реплицировал ваши модели в точности так, как вы их описали, затем я создал конечную точку Mirage.для обработки запросов на получение одного заказа:
this.get('/orders/:id', (schema, request) => {
let responseData = {
data: {
id: request.params.id,
type: 'orders',
attributes: { 'payment-status': 1 },
relationships: {
"payment-method": {
data: { id: "42", type: "payment-methods" }
}
}
}
};
if(request.queryParams.include === "payment_method") {
responseData.included = [{
type: "payment-methods",
id: "42",
attributes: { name: "Credit Card" }
}];
}
return responseData;
});
Вы увидите, что если queryParams
включает ?include=payment_method
, это гарантирует, что способ оплаты включен в ответ JSON.
Еще одна вещь, которую я заметил в вашем примере, заключалась в том, что ваш model()
хук в маршруте review-order.js
кажется немного нетрадиционным. Когда я просматривал этот пример, я использовал динамический сегмент на review-order
маршрут и убедился, что я передал объект заказа при переходе к нему.Вот мое определение маршрутизатора:
Router.map(function() {
this.route('review-order', { path: '/review/:id'});
});
Затем я создал простую кнопку с действием createOrder()
для имитации создания заказа:
actions: {
createOrder() {
let paymentMethod = this.store.createRecord('payment-method', {
name: 'Credit Card'
});
let order = this.store.createRecord('order', {
id: 'not-null',
paymentStatus: 1,
paymentMethod: paymentMethod,
});
// we don't actually save because I don't have a backend setup correctly
// order.save().then(() => { })
// when we're done transition to review route with the model
this.transitionToRoute('review-order', order);
}
}
Как видите, я включаюобъект заказа в вызове transitionToRoute()
.
Тогда мы можем немного упростить ловушку model()
в вашем маршруте:
model(params) {
return this.store.findRecord('order', params.id, { include: 'payment_method'})
}
Надеюсь, это поможет вам разобраться в вашей проблеме ?
На этот вопрос ответили в рамках 4-го сезона 4-го сезона «Могу я задать вопрос». Если вы хотите, чтобы мы обсудили этот ответ полностью, вы можете посмотреть видео здесь: https://www.youtube.com/watch?v=W1udsGt8F9g