html - Angular 4/5 reititys piilottaa komponentteja
uusi reitityksessä Angular 4/5:n kanssa, seuraan Angularin verkkosivuston opasta. Minulla on Angular-sovellus, johon haluan saada kaksi erillistä sivua. Tällä hetkellä pääsivu on localhost:8870/dr3-interface ja haluan uuden sivun uusilla komponenteilla osoitteessa localhost:8870/dr3-interface/manage_cycles_instances
Ongelmani on, että kun klikkaan linkkiäni Manage cycles instances, se näyttää kaikki app.component-komponenttini eikä ainoastaan komponentteja, jotka halusin näyttää /manage_cycles_instances-sivullani. Yritin piilottaa niitä käyttämällä *ngIf, mutta tuloksia ei tullut. Onko ideoita?
app.component.html :
<div style="text-align:left">
<h1>{{ title }}</h1>
</div>
<nav>
<a routerLink="/manage_cycles_instances" routerLinkActive="active"> Manage cycles instances</a>
</nav>
<router-outlet></router-outlet>
<div *ngIf="router = '/dr3-interface'">
<h2><d-table></d-table></h2>
</div>
<br/>
<form-upload></form-upload>
<br/>
<list-upload></list-upload>
app-routing.module.ts :
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DataTableComponent } from './datatable/data-table.component';
const appRoutes: Routes = [
{ path: 'manage_cycles_instances', component: DataTableComponent },
/* TO DO : page error
{ path: '**', component: ... }
*/
];
@NgModule({
imports: [
RouterModule.forRoot(
appRoutes,
{ enableTracing: true } // <-- debugging purposes only
)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {}
app.module.ts :
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import {
//all material modules
} from '@angular/material';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { DataTableComponent } from './datatable/data-table.component';
import { DetailsUploadComponent } from './upload/details-upload/details-upload.component';
import { FormUploadComponent } from './upload/form-upload/form-upload.component';
import { ListUploadComponent } from './upload/list-upload/list-upload.component';
@NgModule({
imports: [
BrowserModule,
AppRoutingModule,
BrowserAnimationsModule,
HttpClientModule,
//material modules
],
declarations: [
AppComponent,
DataTableComponent,
DetailsUploadComponent,
FormUploadComponent,
ListUploadComponent
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule {
}
Vastaus #1
Reittisi tulisi olla tämä:
const appRoutes: Routes = [
{ path: 'dr3-interface', component: DrThreeComponent, children: [ // I don't know which component to use for this route
{ path: 'manage_cycles_instances', component: DataTableComponent },
]},
];
Koska haluat käyttää sisäkkäisiä reittejä, sinun tulisi tehdä sisäkkäisiä reittejä. Huomaa, että DrThreeComponent -komponentillasi tulisi olla router-outlet, koska sillä on alikomponentteja.
Sinun ei tarvitse käyttää ehtoja koodissasi, koska reititin hoitaa komponenttiesi näyttämisen.
Selitys :
Aloitat sillä, että sinulla on index.html-tiedosto. Se sisältää vain yhden tunnisteen rungossaan, yleensä app-root. Tämä tunniste korvataan bootstrapatun komponenttisi toimesta, joka on yleensä AppComponent.
Jos haluat reitittää sovelluksesi, sinun on käytettävä reititintä. Tarvitaan useita vaiheita:
1 - Laita router-outlet-tägi komponenttiin, joka ohjaa muita (tässä, app-komponentti)
2 - Luo reittisi (teit sen, ja korjasin sen vastauksessani).
3 - lasten reittien tapauksessa (reittejä, jotka on erotettu kauttaviivoilla, kuten sinun), laita router-outlet-tagi jokaiseen vanhempikomponenttiin ja children-ominaisuus vastaaviin reitteihin.
Tässä tapauksessasi, jos tekisimme puun, se näyttäisi tältä:
index.html
|
|--app component (with router outlet)
|
|--DrThree component (with router outlet)
|
|--ManageCycles component
Joten käytännössä, index näyttää sovelluksen, sitten sovellus näyttää DrThreen, sitten DrThree näyttää ManageCyclesin.
