Импорт в модуль с отложенной загрузкой в Angular5

#angular5 #lazy-loading

#angular5 #отложенная загрузка

Вопрос:

Попытка сгруппировать некоторые компоненты в модули отложенной загрузки и проблема с импортом материалов:

 error: Error: StaticInjectorError(AppModule)[MatCheckbox -> InjectionToken mat-checkbox-click-action]: 
  StaticInjectorError(Platform: core)[MatCheckbox -> InjectionToken mat-checkbox-click-action]: 
    NullInjectorError: No provider for InjectionToken mat-checkbox-click-action!)
  

Такая же ошибка появляется для большинства компонентов материала (например, mat-checkbox), но, например, она отлично работает с mat-icon:

 #working fine:
<mat-icon>phone</mat-icon>
<mat-slider min="1" max="5" step="0.5" value="1.5"></mat-slider>

#errors:
<mat-slide-toggle>Slide me!</mat-slide-toggle>
<mat-radio-group>
   <mat-radio-button value="2">Option 2</mat-radio-button>
</mat-radio-group>
<mat-checkbox>Hello world</mat-checkbox>
  

У меня следующая архитектура приложения:

  • app.module импортирует dashboard.module не ленивым способом
  • dashboard.module импортирует test.module ленивым способом
  • у test.module есть компонент с ошибкой, описанной выше

Что это за проблема? Я пропускаю какой-то импорт? Нормально ли иметь отложенную загрузку в подмодулях, как в этом случае?

Редактировать:

#app.module.ts (упрощенный модуль приложения)

 import { DashboardModule } from './dashboard/module';
import { AppComponent } from './app.component';
import { RouterModule, Routes, PreloadAllModules } from '@angular/router';
import {MatCheckboxModule} from '@angular/material/checkbox';


const routes: Routes = [
    {
        path: 'dashboard',
        redirectTo: 'dashboard/test',
        pathMatch: 'full',
    }
];

@NgModule({
    declarations: [
      AppComponent
    ],
    imports: [
        RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }),
        DashboardModule,
        MatCheckboxModule,

   ],
   bootstrap: [AppComponent],
export class AppModule {
}
  

#module.ts (упрощенный модуль панели мониторинга)

 import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DashboardResolver } from './test/resolver';
import { DashboardComponent } from './test/component';

const dashboardRoutes: Routes = [
    {
        path: 'dashboard',
        component: DashboardComponent,
        children: [
            {
                path: 'test',
                pathMatch: 'full',
                loadChildren: './test/module#DashboardTestModule',
                data: {loginStatusShouldBe: true},
                resolve: {
                    test: DashboardResolver,
            },
        },
        ]
    }
];

@NgModule({
    imports: [
        CommonModule,
        RouterModule.forChild(dashboardRoutes),
    ],
    exports: [
        RouterModule,
    ],
    providers: [
        DashboardResolver,
    ],
export class DashboardModule {
}
  

#module.ts (упрощенный тестовый модуль)

 import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TestComponent } from './component';
import { RouterModule, Routes } from '@angular/router';

const testRoutes: Routes = [
    {
        path: '',
        component: TestComponent,
    },
];

@NgModule({
    imports: [
        CommonModule,
        RouterModule.forChild(testRoutes),
    ],
    declarations: [
        TestComponent,
    ],
    exports: [
        RouterModule,
    ],
})
export class DashboardTestModule {
}
  

Комментарии:

1. Не могли бы вы прикрепить определения своих модулей?

2. @AlejandroCamba добавил упрощенные определения модулей, в противном случае это огромные файлы, но попытался выбрать основные вещи

Ответ №1:

Похоже, вам не хватает поставщика в вашем модуле. Добавьте MAT_CHECKBOX_CLICK_ACTION в свой модуль приложения:

 providers: [
    ...,
    MAT_CHECKBOX_CLICK_ACTION
]
  

или MatCheckboxModule в ваш модуль приложения:

 imports: [
    ...,
    MatCheckboxModule
]
  

Комментарии:

1. Спасибо за идею, Дипен, но это ничего не меняет. Я также добавил в свой пример кода.

2. @jokuja даже после добавления matcheckboxclickaction он не работает? Может быть, мы что-то упускаем, и наличие MVP помогло бы.

3. При добавлении MAT_CHECKBOX_CLICK_ACTION ошибка изменилась на: ошибка: Ошибка: StaticInjectorError(AppModule)[Матрица -> InjectionToken mat-ripple-global-options]: StaticInjectorError(платформа: ядро)[Матрица -> Мат-ripple-global-options]:

4. @jokija В этом случае ваш подход должен заключаться в добавлении отсутствующих поставщиков один за другим, пока ошибка не будет устранена. Похоже, в вашем модуле приложения отсутствует несколько импортных и / или поставщиков.

5. Да, теперь это простая часть, заставила ее работать. Большое спасибо! Но есть ли у вас идея, почему материал не импортирует это автоматически?

Ответ №2:

Благодаря предыдущей идее, решенной следующим образом:

  import {MatCheckboxModule, MAT_CHECKBOX_CLICK_ACTION} from '@angular/material/checkbox';

...

 {provide: MAT_CHECKBOX_CLICK_ACTION, useValue: 'check'},