Angular2:将服务注入防护时无法解析所有参数

Angular2:将服务注入防护时无法解析所有参数,angular,typescript,angular2-routing,Angular,Typescript,Angular2 Routing,我正在将我的angular2应用程序更新为RC.7,我的守卫遇到了一个障碍,在允许访问页面之前检查用户权限。现在,我已经简化了guard,使其始终返回true,但它仍然不起作用-看起来它找不到我的appStateService,但我已经将其注入到我的应用程序中的其他组件和服务中,并且在那里工作正常 防护代码: import { Inject, Injectable } from '@angular/core'; import { CanActivate, Router, ActivatedRou

我正在将我的angular2应用程序更新为RC.7,我的守卫遇到了一个障碍,在允许访问页面之前检查用户权限。现在,我已经简化了guard,使其始终返回true,但它仍然不起作用-看起来它找不到我的appStateService,但我已经将其注入到我的应用程序中的其他组件和服务中,并且在那里工作正常

防护代码:

import { Inject, Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

import { AppStateService } from '../../appState';

@Injectable()
export class MonitorPermissionGuard implements CanActivate {

constructor(private appStateService: AppStateService, private router: Router) {}

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    console.log('guard called');
    return true;
}
}

我的app.module.ts文件已将AppStateService和MonitorPermissionGuard添加到提供程序阵列中

运行应用程序时,我在控制台中遇到以下错误:

metadata_resolver.js:523 Uncaught Error: Can't resolve all parameters for MonitorPermissionGuard: (?, Router).
我不确定这里发生了什么,因为我在整个应用程序中都使用了appStateService,没有任何问题

谢谢

编辑:AppStateService的代码

@Injectable()
export class AppStateService {

public appState: AppStateModel;

constructor() {
    this.appState = new AppStateModel();
}

toggleSidenav() {
    this.appState.sidenavExpand = !this.appState.sidenavExpand;
}

clearSidenav() {
    this.appState.sidenavButtons = new Array<SidenavButton>();
}

addSidenavLink(buttonText: string, iconClass: string, route: string) {
    let sidenavButton: SidenavButton = new SidenavButton(buttonText, iconClass, route);
    this.appState.sidenavButtons.push(sidenavButton);
}

setPageTitle(pageTitle: string) {
    this.appState.pageTitle = pageTitle;
}

hasPermission(feature: string) {
    return this.appState.userPermissions[feature];
}

giveFeaturePermission(feature: string) {
    this.appState.userPermissions[feature] = true;
}

recantFeaturePermission(feature: string) {
    this.appState.userPermissions[feature] = false;
}

showInfo(message: string) {
    this.showMessage('INFO', message);
}

showWarning(message: string) {
    this.showMessage('WARNING', message);
}

showError(message: string) {
    this.showMessage('ERROR', message);
}

private showMessage(type: string, message: string) {
    this.appState.appMessage.type = type;
    this.appState.appMessage.message = message;
    this.appState.isMessageShown = true;
    setTimeout(() => { this.appState.isMessageShown = false; }, 2000);
}

}
@Injectable()
导出类AppStateService{
公共appState:AppStateModel;
构造函数(){
this.appState=新的AppStateModel();
}
toggleSidenav(){
this.appState.sidenavExpand=!this.appState.sidenavExpand;
}
clearSidenav(){
this.appState.sidenavButtons=新数组();
}
addSidenavLink(按钮文本:字符串,图标类:字符串,路由:字符串){
let sidenavButton:sidenavButton=新的sidenavButton(buttonText,iconClass,route);
这个.appState.sidenavButtons.push(sidenavButton);
}
setPageTitle(pageTitle:string){
this.appState.pageTitle=页面标题;
}
hasPermission(功能:字符串){
返回此.appState.userPermissions[feature];
}
giveFeaturePermission(功能:字符串){
this.appState.userPermissions[feature]=true;
}
recantFeaturePermission(功能:字符串){
this.appState.userPermissions[feature]=false;
}
showInfo(消息:字符串){
此.showMessage('INFO',message);
}
showWarning(消息:字符串){
此.showMessage('WARNING',message);
}
淋浴ROR(消息:字符串){
此.showMessage('ERROR',message);
}
私有showMessage(类型:string,消息:string){
this.appState.appMessage.type=type;
this.appState.appMessage.message=消息;
this.appState.isMessageShown=true;
setTimeout(()=>{this.appState.isMessageShown=false;},2000);
}
}

您能给我们看一下AppStateService吗?也许这方面的某些东西会指向正确的方向?我想知道它在更新AppStateModel时是否有问题。你能在构造器中注释掉它的新内容吗(你可能需要注释掉所有内容,但这至少可以让它作为一个测试加载)@DaveV这是一个很好的口号,我已经注释掉了appStateService的内部以及使用引用appStateService缺少方法的保护的组件之一的代码,现在页面正在加载,保护被正确调用。你知道我有一个快速的方法可以做到这一点吗?在我的代码中导出AppStateModel(现在它只是一个内部模型)?你知道为什么当我尝试在一个守卫中使用AppStateService时,它才会中断吗?当我以前在组件和服务中毫无问题地使用AppStateService时?所以我对它进行了一些研究,我发现导致这个错误的其实不是AppStateModel的更新,而是AppStateService中的一个函数。如果我取消对addSidenavLink函数以外的所有函数的注释,那么guard将实例化并正常工作,但此函数会破坏它-试图调查这是为什么happening@DaveV好的,算了,这是由于sidenav按钮的创建造成的-如果我想冒险猜测原因,因为我的sidenav按钮模型位于共享/文件夹中并从中导出,我的防护从同一个地方导出-这是从shared/**/MonitorPermissionGuard->AppStateService->shared/**/SidenavButton创建循环依赖关系-只是通过从共享文件夹中删除我的SidenavButton并将其重新创建为AppStateService的内部结构来进行检查(它只在那里使用)现在原始代码可以工作了。