2017-05-26 24 views
5

将ActivatedRouteSnapshot注入组件不起作用(并且两者都不注入ActivatedRoute)。这里堆栈跟踪:无法注入ActivatedRouteSnapshot

"Error: Can't resolve all parameters for ActivatedRouteSnapshot: (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?). 
at SyntaxError.ZoneAwareError (http://localhost:4200/polyfills.bundle.js:7042:33) 
at SyntaxError.BaseError [as constructor] (http://localhost:4200/vendor.bundle.js:73735:16) 
at new SyntaxError (http://localhost:4200/vendor.bundle.js:6140:16) 
at CompileMetadataResolver._getDependenciesMetadata (http://localhost:4200/vendor.bundle.js:19345:31) 
at CompileMetadataResolver._getTypeMetadata (http://localhost:4200/vendor.bundle.js:19220:26) 
at CompileMetadataResolver._getInjectableMetadata (http://localhost:4200/vendor.bundle.js:19208:21) 
at CompileMetadataResolver.getProviderMetadata (http://localhost:4200/vendor.bundle.js:19450:40) 
at http://localhost:4200/vendor.bundle.js:19408:49 
at Array.forEach (native) 
at CompileMetadataResolver._getProvidersMetadata (http://localhost:4200/vendor.bundle.js:19375:19) 
at CompileMetadataResolver.getNonNormalizedDirectiveMetadata (http://localhost:4200/vendor.bundle.js:18848:30) 
at CompileMetadataResolver._loadDirectiveMetadata (http://localhost:4200/vendor.bundle.js:18736:23) 
at http://localhost:4200/vendor.bundle.js:18937:54 
at Array.forEach (native) 
at CompileMetadataResolver.loadNgModuleDirectiveAndPipeMetadata (http://localhost:4200/vendor.bundle.js:18936:41)" 

在组件中,ActivatedRouteSnapshot注入如下:

constructor([...], private router: Router, 
      private route: ActivatedRouteSnapshot) { 
    [...] 
} 

ActivatedRouteSnapshot在app.component.ts提供:

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'], 
    providers: [[...], ActivatedRouteSnapshot] 
}) 

我试图访问查询同样PARAMS它是如何在这里完成:https://stackoverflow.com/a/38997116/3433306

按照文档应该是简单,因为它增加了构造函数的参数:https://angular.io/docs/ts/latest/api/router/index/ActivatedRouteSnapshot-interface.html

我是什么缺少成功注入ActivatedRouteSnapshot?

+1

AFAIK'ActivatedRouteSnapshot'不是供应商。只要你的应用程序路由器连接到你的组件,你可以简单地将快照注入到其中,而不需要其他任何东西。 – Zircon

+1

从'providers:[[...],ActivatedRouteSnapshot]''中删除'ActivatedRouteSnapshot''。它由路由模块自动提供 –

+0

当我从提供程序列表中删除它时,出现错误:错误:./LoginPageComponent类LoginPageComponent - 内联模板中的错误:6:10由以下原因引起:没有ActivatedRouteSnapshot!提供程序!我试图在LoginFormComponent中注入错误中提到的LoginPageComponent的子项) – studersi

回答

22

使用ActivatedRoute而不是ActivatedRouteSnapshot。然后你可以使用这样的快照:

constructor(activatedRoute: ActivatedRoute) { 
    var snapshot = activatedRoute.snapshot; 
} 
+0

这样做的窍门,谢谢! – studersi

+1

我无法理解为什么会造成问题? – Akshay

+2

@Akshay显然,'ActivatedRouteSnapshot'不是提供者,不能被注入(参见原始问题下的注释)。但是,如果注入'ActivatedRoute',则可以访问随附的快照。 – studersi