#angular #typescript #routing #components #router-outlet
#angular #typescript #маршруты #Компоненты #маршрутизатор-аутлет
Вопрос:
- У меня есть браузерное приложение Angular 2 V 7.3.6.
- Приложение представляет собой SPA, но со многими компонентами и подкомпонентами.
- В index.html файл, у меня есть основной компонент, на котором размещены именованные маршрутизаторы, и он выглядит следующим образом:
HTML-код для основного компонента
<div class="div-A">
<router-outlet name="Outlet-A"></router-outlet>
</div>
<div class="div-B">
<router-outlet name="Outlet-B"></router-outlet>
</div>
<div class="div-C">
<router-outlet name="Outlet-C"></router-outlet>
</div>
- Внутри класса main components TypeScript я хочу создать новый
экземпляры других компонентов и отобразить их в Outlet-A, Outlet-B или
Выход-C. - Просто в качестве примера я создаю LoginComponent в конструкторе и хочу показать его в Outlet-B
TS-код для основного компонента:
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { LoginComponent } from './LoginComponent';
@Component
(
{
selector: 'main',
templateUrl: './main.html',
styleUrls:['./main.css']
}
)
export class MainComponent
{
constructor (private router :Router)
{
login:LoginComponent = new LoginComponent();
this.CreateAndShowAnyComponent("Outlet-B", login);
}
CreateAndShowAnyComponent(outletName:string, component:any): void
{
//WHAT TO DO HERE?
//IS THIS EVEN POSSIBLE?
//PSEUDO CODE:
this.router.outlets[outletName].clear();
this.router.outlets[outletName].add(component);
}
}
Чего я хочу добиться, так это следующего:
-
Нет жестко закодированных типизированных маршрутов. Не внутри HTML, не внутри компонента / модулей.
-
Все создание экземпляра и маршрутизация должны управляться кодом.
-
URL браузера всегда должен оставаться неизменным и никогда не меняться (localhost: 4200 vs localhost: 4200 / changedRoute)
Чем отличается от других вопросов / ответов по SO?
Я прочитал много других примеров в SO и Интернете, и все они по-прежнему включают «жестко закодированные» определения маршрутов, подобные этому: (фрагмент кода из другого потока)
const routes: Routes = [
{path: '', redirectTo: 'home', pathMatch: 'full'},
{path: 'home', component: HomeComponent},
];
Мне не нужны жестко закодированные маршруты, подобные приведенным выше…
Мой вопрос:
Возможно ли это и как должен выглядеть код?
(смотрите => ПСЕВДОКОД выше в примере main.ts)
Комментарии:
1. Ваше требование можно резюмировать как необходимость загружать определенные компоненты строго с помощью кода и отображать их в предварительно назначенной области вашего html без изменения URL. Например,
LoginComponent
вdiv-B
маршрутизаторе-розетке. В этом случае вам следует обратить внимание на структурные директивы и альтернативы, такие какng-template
,NgComponentOutlet
и так далее. Поскольку вы на самом деле не используете какие-либо функции маршрутизации, попытка использоватьrouter-outlet
только для отображения компонентов модифицирует функцию и приведет к ненужной сложности вашего кода.2. Из краткого обзора angular.io/api/common/NgComponentOutlet , это кажется многообещающим. И, конечно, вы правы: зачем использовать маршрутизатор-аутлет, когда мне не нужна эта функция? Дело в том, что все примеры и видеоуроки, касающиеся Angular, включают маршрутизацию с помощью маршрутизатора-розетки. Поскольку Angular для меня очень новый, я подумал, что это будет правильный путь …. хммм…
3. что, если попробовать отложенную загрузку без маршрутизатора? stackblitz.com/edit /… или динамические компоненты