2017-02-07 4 views
0

として注入されていませんホームルートに送信し、認証ガードは、新しいインスタンスであるため、認証されたユーザのために未定義を返すユーザサービスの新しいインスタンスを起動するAngular2サービスは、私は以下のサービスが定義されていシングルトン

@Injectable() 
export class AuthGuard implements CanActivate { 

constructor(private router: Router, private _userService: UserService) { } 

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 

    if (this._userService.getAuthenticatedUser()) //is undefined????? 
    { 
     return true; 
    } 

    // not logged in so redirect to login page with the return url 
    this.router.navigate(['/login'], { queryParams: { returnUrl: state.url }}); 
    return false; 
} 
} 

私のモジュールは、そのように宣言されています

@NgModule({ 
declarations: [ 
AppComponent, 
LoginComponent, 
HomeComponent, 
ManageUsersComponent, 
StandingDataComponent 
], 
imports: [ 
BrowserModule, 
FormsModule, 
HttpModule, 
AppRoutingModule 
], 
providers: [AuthGuard,UserService], 
bootstrap: [AppComponent] 
}) 
export class AppModule { } 

マイルーティングクラスは以下の通りです:

const appRoutes: Routes = [ 
{path: '', component: HomeComponent, canActivate:[AuthGuard]},  
{ path: 'login', component: LoginComponent }, 
{path: 'home', 
component:HomeComponent, canActivate:[AuthGuard], 
children: [{path: 'manageusers', component: ManageUsersComponent, outlet: 'innerPage'}, 
      {path: 'standingdata', component: StandingDataComponent, outlet: 'innerPage'}] 
}, 
// otherwise redirect to home 
{ path: '**', redirectTo: '' }]; 

@NgModule({ 
    imports: [RouterModule.forRoot(appRoutes)], 

exports: [RouterModule] 
}) 
export class AppRoutingModule { } 

ユーザーサービスのコンストラクタコードが発射され、両方のログインページがヒットしたときに、そして成功した場合認証が行われます。

この種の問題は、UserServiceがコンポーネントとモジュールの両方で定義されている場合に発生しますが、私の場合はモジュールが定義されている唯一の場所です。

+0

問題はXY問題であり、それがシングルトンではないという前提が、答えを間違った方法で導きます。上記のコードから、シングルトン以外の何かをすることはできません。疑問がある場合は、グローバル変数に '_userService'を公開してチェックして、それらが等しいかどうかを確認してください。あなただけがこれを行うことができます。質問には[MCVE](http://stackoverflow.com/help/mcve)が必要です。 – estus

+0

私は、コンストラクタ内のコードは、それがシングルトンではないことを複数回出したという事実を考えましたか? – jazza1000

+0

コンストラクタに '' 'が1つだけあれば、そうです。コンストラクタ(; private_http:Http){console.log( "コンストラクタ";})の構文エラーがあるという事実は、実際のコードが何らかの方法で投稿したコードと異なることを示しています。私がA2 DIのことを知っているから、もしあなたがプロバイダー:[UserService]を持っていなければ、異なるインスタンスを持つことはできません。 – estus

答えて

0

は:

Angular2 router.navigate refresh page

これは、それをテストするために私を導きましたInternet Explorerは正常に動作しました(Chromeでは動作していません)

それは次の行が実行されたときにページ全体がリフレッシュされたことが判明:

ボタンを タイプせずに、Chromeのデフォルトのアクションは、治療のためにあったので、もう一度再ロードするために、ユーザーサービスを引き起こした
this.router.navigate([this.returnUrl]); 

ボタンは送信としてクリックします。

修正は、それは今、すべてのブラウザで動作するHTML

<button type="button" class="btn btn-primary"(click)="validateUser(username, password)">Login</button> 

でのログインボタンにタグタイプ=「ボタン」を追加することでした。

0

ない、それが今のように見えますが、Angular2のrc.4に、私はこのアプローチを使用することができるかを確認します。

bootstrap.tsあなたが所望の成分にsingletonServiceNr1、またはsingletonServiceNr2を注入たより

import {AppComponent} from './components/AppComponent; 
import { singletonServiceNr1, singletonServiceNr2) from './services/Services; 

let singletonServices = [ 
    singletonServiceNr1, 
    singletonServiceNr2 
]; 

bootstrap(AppComponent, [singletonServices]); 

通常の方法。彼らは今シングルトンです。あなたのケースでは


あなたはpropably同じことを行う必要があります。解決策は以下のstackoverflowで見つけた

@NgModule({ 
declarations: [ 
AppComponent, 
LoginComponent, 
HomeComponent, 
ManageUsersComponent, 
StandingDataComponent 
], 
imports: [ 
BrowserModule, 
FormsModule, 
HttpModule, 
AppRoutingModule 
], 
providers: [AuthGuard,UserService], 
bootstrap: [AppComponent, UserService]  // note the change here 
}) 
export class AppModule { } 
+0

私は取得します私がしたときのエラー "未処理プロミスの拒否:Component UserServiceはNgModuleの一部ではないか、またはモジュールがあなたのモジュールにインポートされていません" – jazza1000

+0

Echh、私が言ったように - 私はまだモジュールにはないので、あなたの質問に答えてください。私はまだrc4に固執しています。 –

関連する問題