#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'},