【问题标题】:Routing angular 4/5 hiding components路由角 4/5 隐藏组件
【发布时间】:2018-07-24 22:50:05
【问题描述】:

Angular 4/5 路由的新手,我正在关注他们网站上的 Angular 教程。 我有一个角度应用程序,我希望它能够有两个单独的页面。现在主页是localhost:8870/dr3-interface,我想要一个带有新组件的新页面localhost:8870/dr3-interface/manage_cycles_instances

我的问题是当我点击我的链接Manage cycles instances 时,它会显示我所有的app.component 组件,而不仅仅是我决定在/manage_cycles_instances 上显示的组件。我尝试使用*ngIf 隐藏它们,但没有结果。有什么想法吗?

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 {
}

【问题讨论】:

    标签: html angular typescript angular4-router


    【解决方案1】:

    你的路线应该是这样的:

    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 },
      ]}, 
    ];
    

    因为你想要嵌套路由,你应该做嵌套路由。请注意,您的DrThreeComponent 应该有一个router-outlet,因为它有孩子。

    您不需要在代码中使用条件,因为路由器会处理您的组件的显示。

    说明:

    首先要有一个 index.html 文件。它的主体中只包含一个标签,通常是app-root。该标签将被您的引导组件替换,通常为AppComponent。

    如果您想路由您的应用程序,您需要使用路由器。需要几个步骤:

    1 - 将 router-outlet 标签放在将路由其他人的组件(此处为应用组件)

    2 - 创建你的路线(你做了,我在回答中更正了它)。

    3 - 如果是子路由(用斜线分隔的路由,就像你的一样),在每个父组件中放置一个路由器出口标签,并在相应的路由中添加一个 children 属性。

    在你的情况下,如果我们要制作一棵树,它看起来像这样:

    index.html
      |
      |--app component (with router outlet)
           |
           |--DrThree component (with router outlet)
                |
                |--ManageCycles component
    

    所以基本上,index 会显示 app,然后 app 会显示 DrThree,然后 DrThree 会显示 ManageCycles。

    【讨论】:

    • 所以我应该用 app.component (d-table, form-upload, list-upload) 中的主要组件创建一个新组件?当您说添加 &lt;router-outlet&gt; 时,您的意思是使用 &lt;a link to /dr3-interface&gt; 作为我为 /manage_cycles_instances 写的那个?
    • 我不知道你是否应该编写一个新组件,首先尝试使用现有的组件,例如DataTableComponent,至少看看它是如何工作的!当我说你必须添加一个路由器出口时,我的意思是你应该在你的组件的 HTML 中添加&lt;router-outlet&gt;&lt;/router-outlet&gt;,因为路由器出口将被你在路由配置中提供的组件替换
    • 明白,但在你的例子中DrThreeComponent,基本上是我的AppComponent 对吗?而且我的 AppComponent 中已经有一个 &lt;router-outlet&gt; ,您的意思是在我的 DataTableComponent 中添加一个?抱歉,我对此有点陌生,有点困惑
    • 不,AppComponent 是您的应用组件。它是bootstraped(参见main.ts),所以你不应该编辑它。它应该包含一个路由器插座,它将显示默认路由(在您的情况下,没有,但我们可以修复它)。 DrThreeComponent 是另一个组件,它也有一个路由器插座。也许你想让我对我的帖子做一个快速的解释?
    • 如果你有时间,可能会很棒,只是为了了解整个事情是如何运作的。
    猜你喜欢
    • 2018-07-04
    • 2018-05-22
    • 2015-07-18
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多