为什么Angular 2渲染应用程序组件模板两次

时间:2017-09-12 19:28:19

标签: angular angular-components router-outlet

我想在整个应用中显示常见的页眉和页脚。但是当我尝试这样做时,它会显示两次: -

app.component.html

<header>
    Header
</header>
<router-outlet></router-outlet>
<footer>
    Footer
</footer>

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
}

app.module.ts

RouterModule.forRoot([
  {path: 'home', component: AppComponent},
  {path: '*', redirectTo: 'home', pathMatch: 'full'},
  {path: '**', redirectTo: 'home', pathMatch: 'full'}
])

结果

Header
Header
Footer
Footer

上次我通过创建页眉和页脚的组件来解决这个问题。我知道如果我这样做会有效,但我想明白为什么这是错误的......

2 个答案:

答案 0 :(得分:19)

因为App组件是应用程序的根组件,它始终存在,并且也是显示的组件,在此根组件内部,由路由器插座显示,用于“家庭”组件。路径。因此,您要说路由器在应用程序组件中显示应用程序组件。

创建一个真实的,不同的家庭组件。不要在主页上重用根组件。

答案 1 :(得分:0)

在将Angular组件转换为Web组件的情况下,发生了以下事情(如果您或其他读者可以通过此特定用例识别):

Angular Component渲染两次的另一个原因是,您可能将组件注册为 web组件(使用@angular/elements包),同时,您正在使用与角度分量相同的分量。

例如,如果您有一个角度分量(例如<simple-title>)正在另一个角度分量(例如<complex-title>)内部使用,并且您也将第一个分量注册为Web组件(例如{ {1}}),然后第二个组件(createCustomElement(<simple-title>))可以将组件的角度版本和Web组件版本视为有效,然后渲染两次。

解决方案(在我的情况下)是创建另一个有角度的组件,这两个组件都可以重用(例如<complex-title><title-renderer>使用的<simple-title>)。