#javascript #angular #ionic-framework
#javascript #angular #ionic-framework
Вопрос:
Как мне перенаправить на другой маршрут без жесткого обновления?
Я впервые создал приложение ionic / angular. Это опрос, и после того, как пользователь ответит на набор вопросов, они перенаправляются на страницу результатов.
Мое перенаправление на страницу результатов выглядит следующим образом:
import { Router } from '@angular/router'
private router: Router
this.router.navigate(['/result/' this.current_survey.id]);
Я вижу свои результаты только после жесткого обновления, и я не уверен, почему.
Код, с помощью которого произошло перенаправление, находится в моем компоненте опроса, и я перенаправляю компонент результата. В компоненте ngOinit () auf result я извлекаю сохраненные данные из веб-базы данных, но на данный момент данные не существуют.
Блок кода в компоненте опроса выглядит:
if (this.current_survey.finished) {
this.calculateResult().then((result) => {
this.current_survey.result = resu<
this.storageService.update(this.current_survey, this.helperService.SURVEY_STORAGE).then(
(value) => {
this.storageService.removeKey(this.helperService.LAST_NOT_FINISHED_SURVEY);
this.router.navigate(['result', this.current_survey.id]);
});
});
}
ngOinit в моем компоненте результата выглядит:
// Check if survey is a new survey or should be load from previos surveys
let survey_id;
// Get id from route, if any id was given in url
this.route.paramMap.subscribe((params: ParamMap) => {
survey_id = params.get('id');
});
if (survey_id !== null) {
survey_id = parseInt(survey_id, 10);
}
this.showResults(survey_id);
Метод, который был вызван в ngOinit в моем компоненте результата, выглядит:
const key = this.helperService.SURVEY_STORAGE '_' survey_id;
// Preload all neccessary data
this.storageService.getDataByName(key).then((data) => {
if (data.length === 0) {
this.alertService.show('Error', '', 'Result not found :(');
} else {
this.survey = data.shift();
}
});
Ответ №1:
Возможно, вы сможете предоставить больше информации. Где хранятся результаты опроса? Если они хранятся в базе данных, в методе ngOnInit () компонента страницы результатов вы должны иметь возможность запросить последний результат. Другим вариантом может быть то, что при переходе на страницу результатов вы сделали это до завершения публикации результатов опроса. Возможно, вы сможете сделать что-то подобное, чтобы убедиться, что оно сохранено, прежде чем пытаться извлечь значение:
save(surveyResults, surveyId) {
this.someService.postResults(surveyResults)
.subscribe(() => this.navigate(['result', surveyId]))
}
Комментарии:
1. спасибо за ваш ответ. Я добавляю некоторую дополнительную информацию и справочную информацию о моих блоках кода. Я думаю, вы правы в том, что база данных в данный момент не готова, если компонент результата попытается получить доступ. Но я помещаю все в обещание и выполняю в блоке «затем» все шаг за шагом, чтобы избежать этой проблемы.
2. Ах. Я думаю, что ваш SurveyID не вернулся вовремя, чтобы получить результаты. Возможно, вы захотите попробовать сделать что-то вроде
this.route.paramMap.pipe( switchMap(params => this.showResults(params.get('id')) ).subscribe()
, чтобы убедиться, что у вас есть параметр маршрута, прежде чем вызывать showResults.3. спасибо за подсказку. Я тоже пробовал это, но ничего не изменилось. Я не уверен, как продолжить решение этой проблемы. Для меня все выглядит хорошо и имеет смысл. В функции showResults я создаю консоль. войдите, и он покажет правильный SurveyID. Возможно, StorageService не готов в моей функции, но я сталкиваюсь с такого рода проблемами с Promise или я очень плохо понимаю Promise и async.