首页 > 解决方案 > 移动到模块后角材料形式不起作用

问题描述

我们有一个纯粹在基于组件的模型中开发的应用程序,但现在我们正试图提高它的性能,因为有太多的组件确实使我们的应用程序加载非常缓慢。因此,我们最初试图将一些组件包移动到一个模块中,为此我们将所有组件移动到一个模块中并创建并命名为 security.module.ts 并从 ap.module 的声明数组中删除相应的组件.ts 并添加到 security.module.ts

这是我的实际项目结构:

在此处输入图像描述

我们已经将一些组件移到了一个名为 security-vategories 的模块中,如下所示:

在此处输入图像描述

让我举例说明。

在 app.module.ts

//100's of other component imports goes here

@NgModule({
    schemas: [CUSTOM_ELEMENTS_SCHEMA],
    imports: [
        SatPopoverModule,
        RouterModule.forRoot([]), 
        BrowserModule,
        FormsModule,
        ReactiveFormsModule,
        BrowserAnimationsModule,
        MatAutocompleteModule,
        MatButtonModule,
        MatButtonToggleModule,
        MatCardModule,
        MatCheckboxModule,
        MatChipsModule,
        MatStepperModule,
        MatDatepickerModule,
        MatDialogModule,
        MatExpansionModule,
        MatGridListModule,
        MatIconModule,
        MatInputModule,
        MatListModule,
        MatMenuModule,
        MatNativeDateModule,
        MatPaginatorModule,
        MatProgressBarModule,
        MatProgressSpinnerModule,
        MatRadioModule,
        MatRippleModule,
        MatSelectModule,
        MatSidenavModule,
        MatSliderModule,
        MatSlideToggleModule,
        MatSnackBarModule,
        MatSortModule,
        MatTableModule,
        MatTabsModule,
        MatToolbarModule,
        MatTooltipModule,
        AppRoutingModule,
        HttpClientModule,
        AceEditorModule,
        NgxShimmerLoadingModule,
        // Sub modules
        LayoutModule,
        SharedModule
    ],
    declarations: [
        AppComponent,
        // Layout
        LayoutComponent,
        PreloaderDirective,
        // Header
        AppHeaderComponent,
        // Footer
        AppFooterComponent,
        DashboardComponent,
        MsspDashboardComponent,
        // Pages
        //100's of components go here

// Security compoents
CustomGeneratorListComponent,
    CustomGeneratorNewComponent,
    CustomGeneratorEditComponent,
    CustomGeneratorCompliance1NewComponent,
    CustomGeneratorCompliance1EditComponent,
    CustomGeneratorCompliance2NewComponent,
    CustomGeneratorCompliance2EditComponent,
    CustomGeneratorBasicNewComponent,
    CustomGeneratorBasicEditComponent,
    CustomGeneratorStoredEditComponent,
    CustomGeneratorStoredNewComponent,
    CustomGeneratorCustomHeaderNewComponent,
    CustomGeneratorCustomHeaderEditComponent,
    ],
    bootstrap: [AppComponent],
    providers: [
    ]
})

下面是security.module.ts

    //All imports go here
    
    @NgModule({
      declarations: [
        //security components
    
        CustomGeneratorListComponent,
        CustomGeneratorNewComponent,
        CustomGeneratorEditComponent,
        CustomGeneratorCompliance1NewComponent,
        CustomGeneratorCompliance1EditComponent,
        CustomGeneratorCompliance2NewComponent,
        CustomGeneratorCompliance2EditComponent,
        CustomGeneratorBasicNewComponent,
        CustomGeneratorBasicEditComponent,
        CustomGeneratorStoredEditComponent,
        CustomGeneratorStoredNewComponent,
        CustomGeneratorCustomHeaderNewComponent,
        CustomGeneratorCustomHeaderEditComponent,
      ],
      imports: [
        CommonModule,
        BrowserModule,
        BrowserAnimationsModule,
        FormsModule,
        ReactiveFormsModule,
        BrowserAnimationsModule,
        SatPopoverModule,
        HttpClientModule,
        AceEditorModule,
        NgxShimmerLoadingModule,
        LayoutModule,
        SharedModule,
        AppRoutingModule,
        MatAutocompleteModule,
            MatButtonModule,
            MatButtonToggleModule,
            MatCardModule,
            MatCheckboxModule,
            MatChipsModule,
            MatStepperModule,
            MatDatepickerModule,
            MatDialogModule,
            MatExpansionModule,
            MatGridListModule,
            MatIconModule,
            MatInputModule,
            MatListModule,
            MatMenuModule,
            MatNativeDateModule,
            MatPaginatorModule,
            MatProgressBarModule,
            MatProgressSpinnerModule,
            MatRadioModule,
            MatRippleModule,
            MatSelectModule,
            MatSidenavModule,
            MatSliderModule,
            MatSlideToggleModule,
            MatSnackBarModule,
            MatSortModule,
            MatTableModule,
            MatTabsModule,
            MatToolbarModule,
            MatTooltipModule,
RouterModule.forChild([
      { path: "securityCategories", component: CustomGeneratorListComponent },
            { path: "securityCategoriesNew", component: CustomGeneratorNewComponent },
            { path: "securityCategories/:generatorId", component: CustomGeneratorEditComponent },
            { path: "securityCategoriesCompliance1New", component: CustomGeneratorCompliance1NewComponent },
            { path: "securityCategoriesCompliance1Edit/:generatorId", component: CustomGeneratorCompliance1EditComponent },
            { path: "securityCategoriesCompliance2New", component: CustomGeneratorCompliance2NewComponent },
            { path: "securityCategoriesCompliance2Edit/:generatorId", component: CustomGeneratorCompliance2EditComponent },
            { path: "securityCategoriesBasicNew", component: CustomGeneratorBasicNewComponent },
            { path: "securityCategoriesBasicEdit/:generatorId", component: CustomGeneratorBasicEditComponent },
            { path: "securityCategoriesStoredNew", component: CustomGeneratorStoredNewComponent },
            { path: "securityCategoriesStoredEdit/:generatorId", component: CustomGeneratorStoredEditComponent },
            { path: "ssecurityCategoriesCustomHeaderNew", component: CustomGeneratorCustomHeaderNewComponent },
            { path: "securityCategoriesCustomHeaderEdit/:generatorId", component: CustomGeneratorCustomHeaderEditComponent },
    ])
  ],
      ],
      providers: [
        { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true },
        DashboardService,
        TestSuiteService,
        AccountService,
        Handler,
        DatePipe,
        AutocodeGeneratorService,
        UserVariableService
    ],
    })
    export class SecurityCategoriesModule { }

问题是如果我在两个文件中都有组件,那么材料组件正在加载,否则角度材料组件没有加载。如果我从 app.module.ts 中删除与安全相关的组件,那么材料组件不会加载,那么在声明数组中的 app.module.ts 和 security.module.ts 中添加组件有什么用。

如果我单击路由 http://localhost:4200/#/app/securityCategories 然后它重定向到主页 http://localhost:4200/#/app/projects,路由也不起作用。

它会引发以下错误:

core.js:6456 ERROR Error: Uncaught (in promise): Error: NG0301: Export of name 'matMenu' not found!
Error: NG0301: Export of name 'matMenu' not found!
    at cacheMatchingLocalNames (core.js:10354)
    at resolveDirectives (core.js:10185)
    at elementStartFirstCreatePass (core.js:14789)
    at ɵɵelementStart (core.js:14826)
    at CustomGeneratorListComponent_Template (template.html:38)
    at executeTemplate (core.js:9575)
    at renderView (core.js:9379)
    at renderComponent (core.js:10659)
    at renderChildComponents (core.js:9244)
    at renderView (core.js:9404)
    at resolvePromise (zone.js:1213)
    at resolvePromise (zone.js:1167)
    at zone.js:1279
    at ZoneDelegate.invokeTask (zone.js:406)
    at Object.onInvokeTask (core.js:28654)
    at ZoneDelegate.invokeTask (zone.js:405)
    at Zone.runTask (zone.js:178)
    at drainMicroTaskQueue (zone.js:582)
    at ZoneTask.invokeTask [as invoke] (zone.js:491)
    at invokeTask (zone.js:1600)

谁能建议我如何实现这一点?

这就是我的材料设计的样子。但它不是。见截图:

在此处输入图像描述

表格应该是这样的。这是确切的形式。

在此处输入图像描述

我们有一个 layout-routing.module.ts,其中的路由如下:

const routes: Routes = [
    { path: '', redirectTo: '/app/projects', pathMatch: 'full' },
    { path: 'lazy', component: LayoutComponent, loadChildren:() => import('./../security-categories/security-categories.module').then(m => m.SecurityCategoriesModule) },
    {
        path: "app",
        component: LayoutComponent,
        canActivate: [AuthGuard],
        children: [
            { path: "", redirectTo: "/app/projects", pathMatch: "full" },
            { path: "securityCategories", component: CustomGeneratorListComponent },
            { path: "securityCategoriesNew", component: CustomGeneratorNewComponent },
            { path: "securityCategories/:generatorId", component: CustomGeneratorEditComponent },
            { path: "securityCategoriesCompliance1New", component: CustomGeneratorCompliance1NewComponent },
            { path: "securityCategoriesCompliance1Edit/:generatorId", component: CustomGeneratorCompliance1EditComponent },
            { path: "securityCategoriesCompliance2New", component: CustomGeneratorCompliance2NewComponent },
            { path: "securityCategoriesCompliance2Edit/:generatorId", component: CustomGeneratorCompliance2EditComponent },
            { path: "securityCategoriesBasicNew", component: CustomGeneratorBasicNewComponent },
            { path: "securityCategoriesBasicEdit/:generatorId", component: CustomGeneratorBasicEditComponent },
            { path: "securityCategoriesStoredNew", component: CustomGeneratorStoredNewComponent },
            { path: "securityCategoriesStoredEdit/:generatorId", component: CustomGeneratorStoredEditComponent },
            { path: "ssecurityCategoriesCustomHeaderNew", component: CustomGeneratorCustomHeaderNewComponent },
            { path: "securityCategoriesCustomHeaderEdit/:generatorId", component: CustomGeneratorCustomHeaderEditComponent },
            ]
    }
];

export const LayoutRoutingModule = RouterModule.forChild(routes);

我的 layout.component.html

<section id="page-container" class="app-page-container">
  <my-app-header></my-app-header>

  <div class="app-content-wrapper">
    <div class="app-content">
      <div class="full-height">
        <router-outlet></router-outlet>
      </div>
    </div>

    <my-app-footer></my-app-footer>
  </div>
</section>

我的 app.component.html

<div myPreloader class="preloaderbar hide"><span class="bar"></span></div>
<div id="app-main" class="app-main full-height"
   [ngClass]="{'fixed-header' : AppConfig.fixedHeader,
               'nav-collapsed' : AppConfig.navCollapsed,
               'nav-behind' : AppConfig.navBehind,
               'layout-boxed' : AppConfig.layoutBoxed,
               'theme-gray' : AppConfig.theme == 'gray',
               'sidebar-sm' : AppConfig.sidebarWidth == 'small',
               'sidebar-lg' : AppConfig.sidebarWidth == 'large'}">
  <router-outlet></router-outlet>
</div>

标签: javascriptangulartypescriptangular-material

解决方案


推荐阅读