簡體   English   中英

應用路由提供者未找到角度2-在canactivate()之前注入服務

[英]App routing providers not found angular 2 - inject a service before canactivate()

我試圖在我的angular 2應用程序中注入服務,但是當我在angular / router中調用canactivate()時,服務未定義。 在canactivate()調用之前,我如何注入服務。 在此處輸入圖片說明

app.routing.ts

const appRoutes: Routes = [
    {
        path: '',
        component: HomeComponent,
        canActivate: ['AuthGuardService']
    },
    {
        path: 'login',
        component: LoginComponent,
        outlet: 'popup'
    },
    // otherwise redirect to home
    {path: '**', redirectTo: ''}
];

export const appRoutingProviders: any[] = [
    {provide: "AuthGuardService", useValue: AuthGuardService}
];
export const routing: ModuleWithProviders = RouterModule.forRoot(appRoutes);

auth.guard.service.ts

import {Injectable, Inject} from '@angular/core';
import {AuthService} from "./auth.service";
import {Router, CanActivate} from "@angular/router";
import {Observable} from "rxjs";

@Injectable()
export class AuthGuardService  implements CanActivate {

  constructor(@Inject(AuthService) private auth, @Inject(Router)  private router) { 
  }
  canActivate() : Observable<boolean> | boolean{


    if(this.auth.loggedIn()) {

      return true;
    }
    this.router.navigate([{outlets: {popup: 'login'}}]);
    return false;
  }
}

app.module.ts

@NgModule({
    declarations: [],
    imports: [ routing    ]
    providers: [
        appRoutingProviders,
        ...AUTH_PROVIDERS,
        AuthService,
        AuthGuardService,
        HttpService,
        {
            provide: AuthHttp,
            useFactory: AuthHttpServiceFactory,
            deps: [Http, RequestOptions]
        },
        IndicesEffectsService,
        DialogServiceService
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

您需要將路由作為module公開,請嘗試以下操作:

const appRoutes: Routes =
[
    {
        path: '',
        component: HomeComponent,
        canActivate: [AuthGuardService] // <- no quotes
    },
    {
        path: 'login',
        component: LoginComponent,
        outlet: 'popup'
    },
    // otherwise redirect to home
    {path: '**', redirectTo: ''}
];
@NgModule
({
  imports:   [ RouterModule.forRoot(appRoutes)],
  exports:   [ RouterModule],
  providers: [ AuthGuardService ] // <- provide guard
})
export class AppRoutingModule {}

然后在您的AppModule

@NgModule({
    declarations: [],
    imports: [ AppRoutingModule ] // <- import module here
    providers: [
        appRoutingProviders,
        ...AUTH_PROVIDERS,
        AuthService,
        // AuthGuardService, // <- no need for this
        HttpService,
        {
            provide: AuthHttp,
            useFactory: AuthHttpServiceFactory,
            deps: [Http, RequestOptions]
        },
        IndicesEffectsService,
        DialogServiceService
    ],
    bootstrap: [AppComponent]
})
export class AppModule {
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM