Angular 5路由异常:RouterEffects参数无法全部解析,寻求解决建议
解决Angular v5中RouterEffects参数无法解析的问题
嘿,看起来你在Angular v5的NgRx RouterEffects上遇到了依赖注入的坑,这个Uncaught Error: Can't resolve all parameters for RouterEffects: (?, ?, ?)错误本质是Angular的依赖注入(DI)系统找不到你RouterEffects构造函数里参数对应的服务实例。我给你几个针对性的排查和解决步骤:
1. 给RouterEffects补上@Injectable()装饰器
Angular v5里,所有需要被DI系统处理的服务/Effects类都必须标注@Injectable()装饰器,要是你的RouterEffects没加这个,DI根本不知道怎么解析它的参数。赶紧补上:
import { Injectable } from '@angular/core'; import { Actions } from '@ngrx/effects'; // 其他必要的导入 @Injectable() // 这个装饰器绝对不能少! export class RouterEffects { constructor( private actions$: Actions, // 其他构造函数参数 ) {} // 你的Effects逻辑... }
2. 用NgRx的EffectsModule正确注册RouterEffects
RouterEffects是NgRx的效果类,绝对不能手动加到模块的providers数组里,必须通过EffectsModule来注册。在你的根模块(比如AppModule)里,确保这么配置:
import { EffectsModule } from '@ngrx/effects'; import { RouterEffects } from './path/to/router.effects'; import { routes } from './app.routing'; @NgModule({ imports: [ // 其他模块导入 RouterModule.forRoot(routes), EffectsModule.forRoot([RouterEffects]) // 在这里注册你的RouterEffects ], // 不要把RouterEffects加到providers里! }) export class AppModule {}
如果RouterEffects属于某个特性模块,就用EffectsModule.forFeature([RouterEffects])来注册。
3. 检查构造函数参数的类型和导入
错误里的(?, ?, ?)说明DI系统认不出参数的类型,大概率是这几个问题:
- 参数类型拼写错误:比如把
Actions写成Action(少了s),或者把Store的导入路径搞错了; - 参数对应的服务未被提供:如果注入了自定义服务,得确保这个服务已经加到模块的
providers数组里(Angular v5还没有providedIn: 'root'语法,必须手动添加); - 使用了非类型化依赖:如果参数是靠token注入的,得用
@Inject()明确指定,比如:
这种情况要确保import { Inject } from '@angular/core'; constructor(@Inject('MyCustomToken') private customService: MyService) {}MyCustomToken已经在模块里提供了对应的实例。
4. 确认懒加载模块的路由配置没问题
你的路由用了loadChildren懒加载,虽然当前错误和它直接关联不大,但也可以顺手检查一下:比如HomeModule里有没有正确导入RouterModule.forChild()并配置子路由:
import { RouterModule } from '@angular/router'; import { HomeComponent } from './home.component'; @NgModule({ imports: [ RouterModule.forChild([ { path: '', component: HomeComponent } ]) ] }) export class HomeModule {}
按照上面的步骤逐一排查,应该能搞定这个参数解析的问题。
内容的提问来源于stack exchange,提问作者codedamn
相关产品推荐
相关产品推荐

