typescript - Angular 2.0.1: router och canActivate-klass fungerar inte: Ingen direktivanteckning hittades på LoginGuard


här är mitt problem med senaste Angular 2 (2.0.1) och angular router : 3.0.1

När jag kör applikationen får jag följande fel: Fel: (SystemJS) Ingen Directive-annotering hittades på LoginGuard(…)

Jag har en router med en canActivate-klass för att kontrollera åtkomst till routen, här är koden:

import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule  } from '@angular/router';
export const MainWindowRoutes = [
  {
    path: '',
    redirectTo: '/web-portal',
    pathMatch: 'full'
  },
  {
    path: 'web-portal',
    component: MainWindowComponent,
    children: [
      { path: 'device/:id', component: DeviceViewComponent, canActivate: [LoginGuard], pathMatch: 'full' },
      { path: 'location/:id', component: LocationViewComponent, canActivate: [LoginGuard], pathMatch: 'full' },
      { path: 'deviceType/:id', component: DeviceTypeViewComponent, canActivate: [LoginGuard], pathMatch: 'full' },
      { path: 'home', component: WelcomeViewComponent, canActivate: [LoginGuard], pathMatch: 'full' },
      { path: '', component: RouterComponent, canActivate: [LoginGuard], pathMatch: 'full' }
    ]
  }
];
export const LoginRoutes = [
    { path: 'login', component: LoginComponent }
];
export const AUTH_ROUTER_PROVIDERS = [LoginGuard, LoginService];
export const appRoutes: Routes = [
    ...LoginRoutes,
    ...MainWindowRoutes
];

export const appRoutingProviders: any[] = [

];

export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);

Här är loginGuard-klassen:

import { Injectable } from '@angular/core';
import { 
    CanActivate,
    Router,
    ActivatedRouteSnapshot,
    RouterStateSnapshot } from '@angular/router';
import { LoginService } from './login.service';
import { routing } from '../app.routes';

@Injectable()
export class LoginGuard implements CanActivate {


constructor(private loginService: LoginService, private router: Router) { }

    canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

        console.log('canActivate !!!');

      if (this.loginService.isLoggedIn()) { 
            return true; 
        } else {
            this.router.navigate(['/login']);
            return false;
        }
    }
}

I app.module startar jag upp routern så här:

bootstrap:  (AppComponent, [AUTH_ROUTER_PROVIDERS ])

Men det fungerar inte alls. Injiceringen verkar inte fungera korrekt för canActivate-klassen (LoginGuard).

Snälla hjälp! ;-)

Hälsningar

Svar #1

Okej bra det fungerar nu.

Faktiskt glömde jag att lägga till det i app.module:

leverantörer : [ AUTH_ROUTER_PROVIDERS, appRoutingProviders,...

Förbaskat, det kunde jag inte gissa. Ibland gör refaktorisering koden mer komplex. Inte säker på att det är en bra idé att ha alla leverantörer i app.module... Tack för din hjälp.

Svar #2

Bootstrap-raden är ogiltig. Det borde vara något i stil med:

@NgModule({
  imports: [BrowserModule, ModuleWithProviders],
  providers: [AUTH_ROUTER_PROVIDERS],
  bootstrap: [AppComponent],
  ...
}
export class AppModule {}
// The browser platform with a compiler
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

// The app module
import { AppModule } from './app.module';

// Compile and launch the module
platformBrowserDynamic().bootstrapModule(AppModule);

Se även

  • https://angular.io/docs/ts/latest/guide/router.html
  • https://angular.io/docs/ts/latest/guide/ngmodule.html#!#bootstrap