Я пытаюсь разработать проект веб-приложения на основе Angular7 (онлайн-ресторан с доставкой еды) с базой данных MySQL. Приложение использует маршрутизатор для навигации и загрузки компонентов на сайте.
во-первых, важная (затронутая) часть app-routing.module:
приложение-routing.module.ts
[...]
{
path: 'menu',
component: MenuComponent,
children: [
{
path: '',
redirectTo: 'categories',
pathMatch: 'prefix'
},
{
path: 'categories',
component: ProductCategoriesComponent,
resolve: {
productCategories: CategoriesResolver,
products: ProductsResolve
},
},
{
path: 'categories/:id',
component: ProductsByCategoryComponent,
resolve: {
productsByCategory: ProductsResolveByCategory,
productCategories: CategoriesResolver
}
},
{
path: '**',
redirectTo: 'categories',
pathMatch: 'prefix'
}
],
},
[...]
** Сценарий использования выглядит следующим образом:
I. Пользователь нажимает навигационную ссылку «Меню» на панели навигации - загружается компонент меню:
URL-адрес после действия: localhost: 4200 / меню / категории / **
меню component.html
<router-outlet></router-outlet>
это просто заполнитель для загрузки категорий товаров, предлагаемых меню - Angular перенаправляет пользователя в меню / категории и загружает ProductCategoriesComponent. Этот использует два средства распознавания - для фактического разрешения всех категорий продуктов и всех продуктов (все они загружены, поскольку не выбрана конкретная категория).
Идентификаторы категорий:
1 - закуски
2 - пицца
3 - паста
4 - напитки
5 - десерты
** II. После того, как пользователь выбирает определенную категорию, весь список фильтруется, и бэкэнд возвращает новый список объектов с запрошенным categoryId: **
product.resolve.ts
@Injectable()
export class ProductsResolveByCategory implements Resolve<any> {
constructor(private productService: ProductService) {
}
resolve(route: ActivatedRouteSnapshot) {
return this.productService.getProductsByCategoryId(route.params['id']);
}
}
маршрутизация приводит нас, например, к: localhost: 4200 / menu / category / 1, когда выбрана категория "закусок".
Пока приложение работало так хорошо, но появилась проблема с отображением контента при определенных условиях - когда пользователь находится в / menu / category / 1 и хочет выбрать другую категорию (например, изменить с 1 на 2), представление не обновляется сам по себе - не загружаются продукты с другим идентификатором категории, мы все еще можем увидеть старые - на данный момент обходной путь состоит в том, чтобы снова нажать кнопку меню, а затем нужную категорию. Более того, нажатие кнопки «назад» в браузере (поэтому он должен вернуться в меню / категории /) приводит к ошибочному запросу (ошибка 400), поскольку веб-интерфейс отправляет запрос с / menu / category / category (double!) Вместо «id». Я не могу найти логического объяснения, почему слово «id» заменяется словом «category»:
products.service.ts
public getProductsByCategoryId(id: number): Observable<Array<ProductModel>> {
return this.http.get('/api/products/categories/' + id).pipe(map((response: Array<ProductModel>) => {
this.productsByCategory = response;
return this.productsByCategory;
}));
}
продукты, по-category.component.ts
Component({
selector: 'app-products-by-category',
templateUrl: './products-by-category.component.html',
styleUrls: ['./../products/products.component.css'],
})
export class ProductsByCategoryComponent implements OnInit {
private productsByCategory: Array<ProductModel> = [];
constructor(private productService: ProductService,
private route: ActivatedRoute) {
}
ngOnInit() {
if (this.route.snapshot.data['productsByCategory']) {
this.productsByCategory = this.route.snapshot.data['productsByCategory'];
}
}
}
Итак, подведем итог: есть две (скорее всего, глупые ошибки в логике):
- Почему при переходе от меню / категорий / 1 к меню / категориям / 2 нужные элементы не загружаются,
- Почему при переходе назад к / menu / category / внешний интерфейс отправляет / menu / Categories / Categories / вместо / menu / Categories / - в качестве переменной 'id', он посылает слово 'category' ... (это проблема возникает также, когда пользователь удаляет / 1 с конца ссылки в браузере)
Любая помощь будет оценена. Спасибо!