Это концептуальный вопрос о том, как «правильно» реализовать требуемую функциональность с помощью Angular 2.
В моем приложении есть меню навигации, панель инструментов и область содержимого. Последний содержит основной <router-outlet>
и отображает различные представления, такие как список и детали.
Я хочу добиться того, чтобы на панели инструментов отображались различные компоненты в зависимости от компонента / представления, отображаемого в области содержимого. Например, компоненту списка нужен элемент управления поиском на панели инструментов, а компоненту сведений нужна кнопка сохранения.
A) Моя первая попытка заключалась в том, чтобы добавить еще один (названный) <router-outlet>
на панель инструментов и отобразить компоненты панели инструментов на основе статических маршрутов. Что в этом плохого:
- Отношение статического содержимого к панели инструментов, на мой взгляд, слишком слабо связано.
- Отношение видно (и может быть изменено) в URL-адресе.
- Выход на панели инструментов сохраняет этот путь, даже если пользователь уходит.
B) Моя вторая попытка состояла в том, чтобы принудительно перейти к компонентам панели инструментов (также используя названный выход панели инструментов) в ngOnInit
компонента главного представления, что более тесно связывает их. Что плохо пахнет:
- A2
- A3, чтобы предотвратить это, я мог «очистить» выход на панели инструментов на
ngOnDestroy
, но я не понял, как это сделать.
C) Даем маршрутизатору последний шанс, поскольку я обнаружил, что это работает:
const ROUTES: Routes = [
{path: "buildings", children: [
{path: "", component: BuildingListComponent, pathMatch: "full", outlet: "primary"},
{path: "", component: BuildingListToolbarComponent, pathMatch: "full", outlet: "toolbar"},
{path: ":id", component: BuildingDashboardComponent, outlet: "primary"}
]}
];
Идея состоит в том, что маршрутизатор выберет соответствующий путь для каждой розетки. Но (нет, это могло быть так просто), к сожалению, это не работает:
const ROUTES: Routes = [
{path: "buildings", children: [
{path: "list", component: BuildingListComponent, pathMatch: "full", outlet: "primary"},
{path: "list", component: BuildingListToolbarComponent, pathMatch: "full", outlet: "toolbar"},
{path: ":id", component: BuildingDashboardComponent, outlet: "primary"}
]}
];
По-видимому (а может быть, и случайно) он работает только с пустым путем. Почему, ну почему?
D) Совершенно иная стратегия заключалась бы в переработке моей иерархии компонентов, чтобы каждый компонент главного представления содержал соответствующую панель инструментов, и использовать проекция содержимого на несколько слотов. Не пробовал, но боюсь столкнуться с проблемами с несколькими экземплярами панели инструментов.
Иногда это кажется обычным вариантом использования, и мне интересно, как специалисты Angular 2 решат эту проблему. Любые идеи?
data
в маршруты для настройки на уровне маршрута, какой компонент должен быть добавлен, как показано в stackoverflow.com/questions/38644314/ - person Günter Zöchbauer   schedule 08.12.2016