gpt4 book ai didi

angular - 为什么 在其中渲染另一个 ,其中包含我的路由组件?

转载 作者:行者123 更新时间:2023-12-04 13:01:53 28 4
gpt4 key购买 nike

我有一个延迟加载的多模块 Angular 7.2.2 应用程序,它似乎正在创建主 AppComponent 的副本。的模板本身,然后在其中渲染路由组件。

这是我对完整但简洁的序言的尝试(我无法在 plunkr 中重现)。请询问我遗漏的任何细节。

序言

我有一个 index.html包含普通 HTML 和 <app-root> 的文件其 <body> 内的元素.这是项目中唯一app-root的地方标 checkout 现。此文件在 angular.json 中引用的 projects.app.architect.build.options.index属性(property)。

AppComponent被声明为

@Component({
selector: 'app-root',
template: `
<router-outlet></router-outlet>
<message-banner [show]="showMessage" [message]="message"></message-banner>
`,
providers: [AuthenticationService, AuthenticationGuard, MessagingService]
})
AppComponent 中的其余逻辑简单地调解 showmessage应用范围通知的内容。我没有路由器 socket Hook ,也没有直接的 DOM 操作。

我的 main.ts像往常一样引导应用程序
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app.module';
import { environment } from './environments/environment';

import { hmrBootstrap } from './hmr';

if (environment.production) {
enableProdMode();
}

const bootstrap = () => platformBrowserDynamic().bootstrapModule(AppModule);

if (environment.hmr && module['hot']) {
hmrBootstrap(module, bootstrap);
}
else {
bootstrap().catch(err => console.log(err));
}

来自以下 AppModule
@NgModule({
imports: [
appRoutes,
BrowserAnimationsModule,
BrowserModule,
CommonModule,
FormsModule,
HttpClientModule,
HttpClientXsrfModule,
ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }),
SharedGenericModule
],
declarations: [
AppComponent,
MessageBannerComponent
],
providers: [
{ provide: APP_BASE_HREF, useValue: '/' },
appRoutingProviders,
ChoosePasswordGuard,
LoadingBarService,
Title,
UserService
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
bootstrap: [AppComponent]
})

export class AppModule {}

使用这些 app.routes (小节选)
const routes: Routes = [
{
path: '',
redirectTo: 'shop',
pathMatch: 'full'
},
{
path: '',
component: AppComponent,
children: [
{
path: 'shop',
data: { key: 'shop' },
loadChildren: "./modules/shop.module#ShopModule",
pathMatch: 'full'
},
{
path: 'car/:id',
data: { key: 'car' },
loadChildren: "./modules/car.module#CarModule",
pathMatch: 'full'
},
{
// This one has child routes, which I will add if needed
path: 'workOrder',
data: { key: 'workOrder' },
loadChildren: "./modules/workOrder.module#WorkOrderModule",
}
// And many more
]
}
]

export const appRoutes: ModuleWithProviders = RouterModule.forRoot(routes, {
enableTracing: false,
onSameUrlNavigation: 'reload'
});

问题

应用程序稳定后,生成的 DOM 如下所示:
<body>
<app-root ng-version="7.2.2">

<router-outlet></router-outlet>

<app-root>
<router-outlet></router-outlet>
<default-routed-component _nghost-c0>...</default-routed-component>
<message-banner ng-reflect-show="true" ng-reflect-message="[object Object]">...</message-banner>
</app-root>

<message-banner ng-reflect-show="true" ng-reflect-message="[object Object]">...</message-banner>

</app-root>
</body>

注意内部 <app-root>没有装饰 ng-version .

另外,我只能以编程方式与内部 <message-banner> 通信。 ,外面的似乎断开了。但是在加载第一个路由之前(在应用程序稳定之前)生成的消息会发送到消息横幅的两个实例。

问题

为什么我的应用实例化两个 <app-root> s 带两个 <router-outlets> ,但只使用其中之一。我怎样才能防止它这样做?

我需要保留一个应用程序范围 <message-banner> ,但我显然想要 正好一个 .如果不是因为该组件的重复,它可能只是一个神秘的不便 - 否则该应用程序在所有方面都运行良好。

最佳答案

回想起来,答案非常明显。

主 AppComponent - 包含应用程序唯一的 <router-outlet>我想在整个应用程序中使用的通用代码 - 从主 AppModule 引导并第二次实例化 由路由器作为默认路由的组件,然后加载功能模块作为子路由。

修复只是删除 AppComponent 和子路由;所以要改变app.routes.ts

const routes: Routes = [
{
path: '',
redirectTo: 'shop',
pathMatch: 'full'
},
{
path: '',
component: AppComponent,
children: [
{
path: 'shop',
data: { key: 'shop' },
loadChildren: "./modules/shop.module#ShopModule",
pathMatch: 'full'
},
...
}
]


const routes: Routes = [
{
path: '',
redirectTo: 'shop',
pathMatch: 'full'
},
{
path: 'shop',
data: { key: 'shop' },
loadChildren: "./modules/shop.module#ShopModule",
pathMatch: 'full'
},
...
]

关于angular - 为什么 <app-root> 在其中渲染另一个 <app-root> ,其中包含我的路由组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54913622/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com