Маршрутизатор Angular 4 добавляет компоненты в навигацию routerLink, а не уничтожает их.

При переходе изнутри подмодуля от дочернего маршрута к другому родственному дочернему маршруту маршрутизатор не уничтожает предыдущий компонент, а добавляет новый при переходе вперед и назад.

Почему это происходит?

Начиная с /#/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});

абонент.маршруты.тс

/**
 * 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]
})

абонент.модуль.тс

@NgModule({
   imports: [
      SharedModule,
      CommonModule,
      RouterModule.forChild(subscriberRoutes)
   ],
   declarations: [ // Components / Directives / Pipes
      SubscriberLookupComponent,
      SubscriberRegisterComponent
   ],
   // exports: [
   //    SharedModule,
   //    SubscriberLookupComponent,
   //    SubscriberRegisterComponent
   // ]
})

Вот что происходит в навигации:

дополнение маршрутов


person TetraDev    schedule 18.08.2017    source источник
comment
можно ли воспроизвести с помощью плунжера   -  person Aravind    schedule 18.08.2017
comment
очень сложно воспроизвести этот файл по одному на плункере, я попробую   -  person TetraDev    schedule 18.08.2017
comment
Вы доступны в teamviewer для дальнейшей отладки?   -  person Aravind    schedule 18.08.2017
comment
позвольте мне попробовать настроить teamviewer через наш брандмауэр здесь   -  person TetraDev    schedule 18.08.2017
comment
Хорошо, я все настроил, попробуем подключиться. есть приватный чат?   -  person TetraDev    schedule 18.08.2017
comment
Давайте продолжим обсуждение в чате.   -  person TetraDev    schedule 18.08.2017


Ответы (2)


У меня была такая же проблема. Я узнаю, что когда мой новый компонент был создан, он выдает исключение, тогда мой старый компонент не уничтожался.

В моем случае в шаблоне у меня {{model.field}}, а в TypeScript model: Model;, но при создании компонента model было undefined. Я думаю, что если при создании компонента возникнет какое-либо исключение, маршрутизатор не сможет уничтожить старый компонент.

Я использовал отладчик кода Visual Studio, чтобы найти причину исключения.

Поэтому я просто поставил *ngIf для проверки модели:

<tag *ngIf="model">
    {{model.field}}
</tag>
person caiofilipemr    schedule 31.08.2017
comment
Благодарю вас! Я не понимал, что мой компонент выдает ошибку, но вы правы. Если компонент A выдает ошибку, то попытка перехода к компоненту B предотвратит уничтожение A маршрутизатором. Это должно быть угловая ошибка. - person TetraDev; 19.09.2017

Сначала я подумал, что это из-за того, что я просматривал свое угловое приложение через BrowserSync.

Казалось, что по какой-то причине javascript BrowserSync мешает маршрутизатору angular. Я предполагаю, что это ошибка. Когда я просматриваю свое приложение напрямую, маршрутизатор работает должным образом.

Однако потом это снова произошло в продакшене без браузерной синхронизации.

Ответ от Caio Filipe исправил это для меня. Это произошло потому, что мой компонент A выдавал ошибку, поэтому при переходе к компоненту B компонент A не мог быть уничтожен из-за ошибки. Я отправил заявку с помощью angular.

person TetraDev    schedule 29.08.2017
comment
Вот еще один билет по той же проблеме: github.com/angular/angular/issues/19093 Серьезность тем временем была увеличена и, надеюсь, скоро будет исправлена. - person Francesco; 09.11.2017