Angular 4 路由器在 routerLink 导航上附加组件而不是销毁它们
Angular 4 router is appending components on routerLink navigation instead of destroying them
当从一个子模块内从一个子路由导航到另一个同级子路由时,路由器不会破坏前一个组件,而是在向前和向后导航时附加新组件。
为什么会这样?
从 /#/subscriber/lookup
开始,移动到 /#/subscriber/register
路线
<a [routerLink]="['../register']">Subscriber register link</a>
app.routes.ts
/**
* Angular 2 decorators and services
*/
import { Routes } from '@angular/router';
/**
* Other services
*/
import { RouteProtection } from '../services/route-protection.service';
// import { DataResolver } from './app.resolver';
/**
* Imported Components
*/
import { LoginComponent } from '../login/login.component';
import { NotFound404Component } from '../404/notfound404.component';
export const ROUTES: Routes = [{
path: '',
redirectTo: 'subscriber',
pathMatch: 'full',
}, {
path: 'subscriber',
loadChildren: '../+subscriber/subscriber.module#SubscriberModule',
// canActivate: [RouteProtection]
}, {
path: 'detail',
loadChildren: '../+detail/detail.module#DetailModule',
canActivate: [RouteProtection]
}, {
path: 'login',
component: LoginComponent
}, {
path: '**',
component: NotFound404Component
}, {
path: '404',
component: NotFound404Component
}];
// export const routing = RouterModule.forRoot(ROUTES, { useHash: true});
subscriber.routes.ts
/**
* Imported Components
*/
import { SubscriberLookupComponent } from './lookup/subscriber-lookup.component';
import { SubscriberRegisterComponent } from './register/subscriber-register.component';
/*
* Shared Utilities & Other Services
*/
// import { RouteProtection } from '../services/route-protection.service';
// import { DataResolver } from '../services/app.resolver';
export const subscriberRoutes = [{
path: '',
children: [{
path: '',
pathMatch: 'full',
redirectTo: 'lookup'
}, {
path: 'lookup',
component: SubscriberLookupComponent, //canActivate: [RouteProtection],
}, {
path: 'register',
component: SubscriberRegisterComponent, //canActivate: [RouteProtection], // resolve: { 'dataBroughtToComponent': DataResolver }
}]
},];
app.module.ts
/**
* `AppModule` is the main entry point into Angular2's bootstraping process
*/
@NgModule({
bootstrap: [AppComponent],
declarations: [ // declarations contains: components, directives and pipes
// Components
AppComponent, LoginComponent, NotFound404Component, // Directives
NavSidebarComponent, NavHeaderComponent, NavFooterComponent
// Pipes
],
imports: [ // import other modules
BrowserModule, SharedModule, BrowserAnimationsModule, RouterModule.forRoot(ROUTES, {useHash: true}), NgbModule.forRoot()
/* ApplicationInsightsModule.forRoot({
instrumentationKey: '116b16e7-0307-4d62-b201-db3ea88a32c7'
})*/
],
providers: [ // expose our Services and Providers into Angular's dependency injection
ENV_PROVIDERS, APP_PROVIDERS, AUTH_PROVIDERS]
})
subscriber.module.ts
@NgModule({
imports: [
SharedModule,
CommonModule,
RouterModule.forChild(subscriberRoutes)
],
declarations: [ // Components / Directives / Pipes
SubscriberLookupComponent,
SubscriberRegisterComponent
],
// exports: [
// SharedModule,
// SubscriberLookupComponent,
// SubscriberRegisterComponent
// ]
})
这是导航中发生的事情:
起初我以为这是因为我正在通过 BrowserSync 查看我的 angular 应用程序。
似乎出于某种原因,BrowserSync 的 javascript 与 angular 的路由器混淆了。我假设这是一个错误。当我直接查看我的应用程序时,路由器按预期工作。
但是,在没有浏览器同步的情况下,它又在生产中发生了。
Caio Filipe 的回答帮我解决了这个问题。 这是因为我的组件 A
抛出错误,所以当导航到组件 B
时,组件 A
由于错误无法销毁.我 submitted a ticket 和 angular.
我遇到了同样的问题。我发现当我的新组件被创建时,它抛出了一个异常,然后我的旧组件没有被销毁。
就我而言,在模板中我有 {{model.field}}
,在 TypeScript 中有 model: Model;
,但是在创建组件时,model
是 undefined
。我认为如果在创建组件时抛出任何异常,路由器不能销毁旧组件。
我使用 Visual Studio 代码调试器来查找异常原因。
所以我只是放了一个 *ngIf
来检查模型:
<tag *ngIf="model">
{{model.field}}
</tag>
当从一个子模块内从一个子路由导航到另一个同级子路由时,路由器不会破坏前一个组件,而是在向前和向后导航时附加新组件。
为什么会这样?
从 /#/subscriber/lookup
开始,移动到 /#/subscriber/register
路线
<a [routerLink]="['../register']">Subscriber register link</a>
app.routes.ts
/**
* Angular 2 decorators and services
*/
import { Routes } from '@angular/router';
/**
* Other services
*/
import { RouteProtection } from '../services/route-protection.service';
// import { DataResolver } from './app.resolver';
/**
* Imported Components
*/
import { LoginComponent } from '../login/login.component';
import { NotFound404Component } from '../404/notfound404.component';
export const ROUTES: Routes = [{
path: '',
redirectTo: 'subscriber',
pathMatch: 'full',
}, {
path: 'subscriber',
loadChildren: '../+subscriber/subscriber.module#SubscriberModule',
// canActivate: [RouteProtection]
}, {
path: 'detail',
loadChildren: '../+detail/detail.module#DetailModule',
canActivate: [RouteProtection]
}, {
path: 'login',
component: LoginComponent
}, {
path: '**',
component: NotFound404Component
}, {
path: '404',
component: NotFound404Component
}];
// export const routing = RouterModule.forRoot(ROUTES, { useHash: true});
subscriber.routes.ts
/**
* Imported Components
*/
import { SubscriberLookupComponent } from './lookup/subscriber-lookup.component';
import { SubscriberRegisterComponent } from './register/subscriber-register.component';
/*
* Shared Utilities & Other Services
*/
// import { RouteProtection } from '../services/route-protection.service';
// import { DataResolver } from '../services/app.resolver';
export const subscriberRoutes = [{
path: '',
children: [{
path: '',
pathMatch: 'full',
redirectTo: 'lookup'
}, {
path: 'lookup',
component: SubscriberLookupComponent, //canActivate: [RouteProtection],
}, {
path: 'register',
component: SubscriberRegisterComponent, //canActivate: [RouteProtection], // resolve: { 'dataBroughtToComponent': DataResolver }
}]
},];
app.module.ts
/**
* `AppModule` is the main entry point into Angular2's bootstraping process
*/
@NgModule({
bootstrap: [AppComponent],
declarations: [ // declarations contains: components, directives and pipes
// Components
AppComponent, LoginComponent, NotFound404Component, // Directives
NavSidebarComponent, NavHeaderComponent, NavFooterComponent
// Pipes
],
imports: [ // import other modules
BrowserModule, SharedModule, BrowserAnimationsModule, RouterModule.forRoot(ROUTES, {useHash: true}), NgbModule.forRoot()
/* ApplicationInsightsModule.forRoot({
instrumentationKey: '116b16e7-0307-4d62-b201-db3ea88a32c7'
})*/
],
providers: [ // expose our Services and Providers into Angular's dependency injection
ENV_PROVIDERS, APP_PROVIDERS, AUTH_PROVIDERS]
})
subscriber.module.ts
@NgModule({
imports: [
SharedModule,
CommonModule,
RouterModule.forChild(subscriberRoutes)
],
declarations: [ // Components / Directives / Pipes
SubscriberLookupComponent,
SubscriberRegisterComponent
],
// exports: [
// SharedModule,
// SubscriberLookupComponent,
// SubscriberRegisterComponent
// ]
})
这是导航中发生的事情:
起初我以为这是因为我正在通过 BrowserSync 查看我的 angular 应用程序。
似乎出于某种原因,BrowserSync 的 javascript 与 angular 的路由器混淆了。我假设这是一个错误。当我直接查看我的应用程序时,路由器按预期工作。
但是,在没有浏览器同步的情况下,它又在生产中发生了。
Caio Filipe 的回答帮我解决了这个问题。 这是因为我的组件 A
抛出错误,所以当导航到组件 B
时,组件 A
由于错误无法销毁.我 submitted a ticket 和 angular.
我遇到了同样的问题。我发现当我的新组件被创建时,它抛出了一个异常,然后我的旧组件没有被销毁。
就我而言,在模板中我有 {{model.field}}
,在 TypeScript 中有 model: Model;
,但是在创建组件时,model
是 undefined
。我认为如果在创建组件时抛出任何异常,路由器不能销毁旧组件。
我使用 Visual Studio 代码调试器来查找异常原因。
所以我只是放了一个 *ngIf
来检查模型:
<tag *ngIf="model">
{{model.field}}
</tag>