1

即使我在 app.module.ts 中有 AppRoutingModule,构建失败并出现错误“'router-outlet' 是一个 Angular 组件,然后验证它是否是该模块的一部分。” 我观察到一种奇怪的行为,这是因为 IVY 和 AOT 启用了,如果其中一个被禁用,它正在工作

这是我的 app.module

import {ErrorHandler, Injectable, NgModule, APP_INITIALIZER} from '@angular/core';
import {CommonModule} from '@angular/common';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';
// import {saveAs} from 'file-saver/FileSaver';
import * as Raven from 'raven-js';
import {CookieModule} from 'ngx-cookie';
import {AppComponent} from './app.component';
import {AppConfig} from './app.config';
import {environment} from '../environments/environment';
import {GlobalErrorHandler} from './app.eror-handler';
import 'hammerjs';
import {SharedModule} from './shared/shared.module';
import {AuthModule} from './auth/auth.module';
import {LandingModule} from './landing/landing.module';
import {AppRoutingModule} from './app-routing.module';
import {ReferralsModule} from './referrals/referrals.module';
import {AppInterceptor} from "./app.interceptor";
import {WebStorageModule} from "ngx-store";
import {AppConfigService} from './shared/app-config.service';
import {ProfileSharedModule} from "./profiles/profile.module";


if (AppConfig.ENVIRONMENT === 'stage' || AppConfig.ENVIRONMENT === 'production') {
  Raven
    .config(AppConfig.RAVEN_URL).install();
}

export function appConfigServiceFactory(appConfigService: AppConfigService): Function {
  return () => appConfigService.getConfig();
}

@Injectable()
export class MyHammerConfig extends HammerGestureConfig {
  overrides = <any>{
    'swipe': {velocity: 0.3, threshold: 10}
  };
}

@Injectable()
export class RavenErrorHandler implements ErrorHandler {
  handleError(err: any): void {
    if (AppConfig.ENVIRONMENT === 'stage' || AppConfig.ENVIRONMENT === 'production') {
      Raven.captureException(err.originalError);
    } else {
      console.error(err);
    }
  }
}

@NgModule({
  imports: [
    BrowserAnimationsModule,
    BrowserModule.withServerTransition({appId: 'startupbyte-app'}),
    CookieModule.forRoot(),
    FormsModule,
    ReactiveFormsModule,
    HttpClientModule,
    CommonModule,
    AppRoutingModule,
    SharedModule,
    AuthModule,
    LandingModule,
    WebStorageModule,
    ProfileSharedModule,
    ReferralsModule,
  ],
  declarations: [
    AppComponent,
  ],
  bootstrap: [AppComponent],
  providers: [
    Ng4TwitterTimelineService,
    AppConfigService,
    {
      // Provider for APP_INITIALIZER
      provide: APP_INITIALIZER,
      useFactory: appConfigServiceFactory,
      deps: [AppConfigService],
      multi: true
    },
    // {provide: RouteReuseStrategy, useClass: CustomReuseStrategy},,
    {
      provide: ErrorHandler,
      useClass: GlobalErrorHandler
    },
    {
      provide: HAMMER_GESTURE_CONFIG,
      useClass: MyHammerConfig
    },
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AppInterceptor,
      multi: true
    }
  ]
})
export class AppModule {
}

这是 app-routing.module.ts

import {NgModule} from '@angular/core';
import {RouterModule, Routes} from '@angular/router';
import {AuthRoutes} from './auth/auth.routes';
import {landingRoutes} from './landing/landing.routes';
import {homeRoutes} from './home/home.routes';
import {WhiteLabelRoutes} from './whitelabel-base/whitelabel-base.routes';
import {AuthGuard} from './auth/auth.guard';
import {MyGroupsListComponent} from './groups/my-groups-list/my-groups-list.component';
import {AnonymousGuard} from "./auth/anonymous.guard";
import {FeatureAccessGuard} from './shared/guards/feature-access.guard';
import {VisibilityGuard} from './shared/guards/visibility.guard';

const routes: Routes = [
  {
    path: '',
    canActivate: [VisibilityGuard],
    children: [
      {
        path: 'topics',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/topics/topic.module').then(m => m.TopicModule)
      },
      {
        path: 'splash',
        canActivate: [AnonymousGuard],
        loadChildren: () => import('app/splash/splash.module').then(m => m.SplashModule)
      },
      {
        path: 'onboarding',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/onboarding/onboarding.module').then(m => m.OnboardingModule)
      },
      {
        path: 'orgs',
        canLoad: [FeatureAccessGuard],
        canActivate: [AuthGuard],
        loadChildren: () => import('app/orgs/org.module').then(m => m.OrgModule),
        data: {
          permissionType: 'view',
          feature: 'orgs'
        }
      },
      {
        path: 'articles',
        canLoad: [FeatureAccessGuard],
        loadChildren: () => import('app/articles/articles.module').then(m => m.ArticlesModule),
        data: {
          permissionType: 'view',
          feature: 'articles'
        }
      },
      {
        path: 'ebooks',
        loadChildren: () => import('app/articles/ebooks-list/ebooks.module').then(m => m.EbooksModule)
      },
      {
        path: 'conversations',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/conversations/conversation.module').then(m => m.ConversationModule)
      },
      {
        path: 'content',
        loadChildren: () => import('app/content/content.module').then(m => m.ContentModule),
      },
      {
        path: 'dashboard',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/dashboard/dashboard.module').then(m => m.DashboardModule)
      },
      {
        path: 'profiles',
        canLoad: [FeatureAccessGuard],
        canActivate: [AuthGuard],
        loadChildren: () => import('app/profiles/profile.module').then(m => m.ProfileModule),
        data: {
          permissionType: 'view',
          feature: 'profiles'
        }
      },
      {
        path: 'programs',
        loadChildren: () => import('app/programs/programs.module').then(m => m.ProgramsModule),
      },
      {
        path: 'events',
        canLoad: [FeatureAccessGuard],
        canActivate: [AuthGuard],
        loadChildren: () => import('app/events/event.module').then(m => m.EventModule),
        data: {
          permissionType: 'view',
          feature: 'events'
        }
      },
      {
        path: 'my_credits',
        loadChildren: () => import('app/referrals/my-rewards/my-rewards.module').then(m => m.MyRewardsModule)
      },
      {
        path: 'amas',
        canActivate: [AuthGuard],
        redirectTo: 'events'
      },
      // to be removed
      {
        path: 'launches',
        canLoad: [FeatureAccessGuard],
        canActivate: [AuthGuard],
        loadChildren: () => import('app/launches/launches.module').then(m => m.LaunchesModule),
        data: {
          permissionType: 'view',
          feature: 'launches'
        }
      },
      // to be removed
      {
        path: 'ideas',
        canLoad: [FeatureAccessGuard],
        canActivate: [AuthGuard],
        loadChildren: () => import('app/ideas/ideas.module').then(m => m.IdeasModule),
        data: {
          permissionType: 'view',
          feature: 'ideas'
        }
      },
      {
        path: 'subscriptions',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/subscriptions/subscriptions.module').then(m => m.SubscriptionsModule)
      },
      {
        path: 'story',
        loadChildren: () => import('app/stories/stories.module').then(m => m.StoriesModule)
      },
      {
        path: 'polls',
        loadChildren: () => import('app/polls/polls.module').then(m => m.PollsModule)
      },
      {
        path: 'notifications',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/activity/activity.module').then(m => m.ActivityModule)
      },
      {
        path: 'communities',
        redirectTo: 'groups'
      },
      {
        path: 'groups',
        canLoad: [FeatureAccessGuard],
        loadChildren: () => import('app/groups/groups.module').then(m => m.GroupsModule),
        data: {
          permissionType: 'view',
          feature: 'groups',
        }
      },
      {
        path: 'jobs',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/jobs/jobs.module').then(m => m.JobsModule)
      },
      {
        path: 'deals',
        canLoad: [FeatureAccessGuard],
        loadChildren: () => import('app/deals/deals.module').then(m => m.DealsModule),
        data: {
          permissionType: 'view',
          feature: 'deals',
        }
      },
      {
        path: 'collections',
        canActivate: [AuthGuard],
        loadChildren: () => import('app/collections/collections.module').then(m => m.CollectionsModule)
      },
      {
        path: 'marketing',
        loadChildren: () => import('app/marketing/marketing.module').then(m => m.MarketingModule)
      },
      {
        path: 'preferences',
        loadChildren: () => import('app/preferences/preferences.module').then(m => m.PreferencesModule)
      },
      {
        path: 'brands',
        loadChildren: () => import('app/brand-pages/brand-pages.module').then(m => m.BrandPagesModule)
      },
      {
        path: 'community-settings',
        loadChildren: () => import('app/workspaces/workspaces.module').then(m => m.WorkspacesModule)
      },
      {
        path: 'features',
        // canActivate: [],
        loadChildren: () => import('app/features/features.module').then(m => m.FeaturesModule)
      },
      {
        path: 'solutions',
        // canActivate: [],
        loadChildren: () => import('app/solutions/solutions.module').then(m => m.SolutionsModule)
      },
      {
        path: 'addons',
        // canActivate: [],
        loadChildren: () => import('app/addons/addons.module').then(m => m.AddonsModule)
      },
      {
        path: 'resources',
        loadChildren: () => import('app/resources/resources.module').then(m => m.ResourcesModule)
      },
      {
        path: 'affiliate-landing',
        loadChildren: () => import('app/workspaces/affiliate-landing/affiliate-landing.module').then(m => m.AffiliateLandingModule)
      },
      {
        path: 'pricing',
        // canActivate: [],
        loadChildren: () => import('app/prices/prices.module').then(m => m.PricesModule)
      },
      {
        path: 'use-cases',
        loadChildren: () => import('app/workspaces/landing/use-cases/use-cases.module').then(m => m.UseCasesModule)
      },
      {
        path: 'platform',
        loadChildren: () => import('app/workspaces/landing/platform/platform.module').then(m => m.PlatformModule)
      },
      {
        path: 'create-trial-workspace',
        loadChildren: () => import('app/workspaces/free-trial-form/free-trial-form.module').then(m => m.FreeTrialFormModule)
      },
      {
        path: 'verification',
        loadChildren: () => import('app/workspaces/verify-email-dialog/verify-email.module').then(m => m.VerifyEmailModule)
      },
      ...WhiteLabelRoutes,
      ...AuthRoutes,
      ...landingRoutes,
      ...homeRoutes,
      {path: '**', redirectTo: '404'}
    ]
  }
];


@NgModule({
  imports: [RouterModule.forRoot(routes, {paramsInheritanceStrategy: 'always', scrollPositionRestoration: 'enabled'})],
  exports: [RouterModule],
  declarations: [],
  providers: []
})
export class AppRoutingModule {
}

构建失败并出现此错误

src/app/app.component.html:8:5 - error NG8001: 'router-outlet' is not a known element:
1. If 'router-outlet' is an Angular component, then verify that it is part of this module.
2. If 'router-outlet' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.

8     <router-outlet></router-outlet>
      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  src/app/app.component.ts:32:16
    32   templateUrl: './app.component.html',
                      ~~~~~~~~~~~~~~~~~~~~~~
    Error occurs in the template of component AppComponent.


4

0 回答 0