私はAngular2アプリケーションを作成しています。私はアプリケーションレベルで提供され、ログインコンポーネントと認証ガードサービスによって使用されるログインサービスクラスを持っています。angle2のアプリケーション全体の単一インスタンスの使用
DIを正しく理解していれば、サービスがAppModuleのプロバイダメタデータを通じてアプリケーションレベルで提供されると、サービスの同じインスタンスがすべてのコンポーネントに提供されます。あるコンポーネントによるサービスクラスは、他のサービスまたはコンポーネントクラスに反映されます。
アプリケーションレベルでログインサービスクラスを提供しましたが、サービスのメンバー変数を1つのコンポーネントから別のコンポーネントに変更していません。ログインコンポーネントはloggedIn変数をtrueに変更しますが、認証ガードサービスからアクセスすると、false値が返されます。
AppModule
@NgModule({
imports: [
BrowserModule,
HttpModule,
ReactiveFormsModule,
MyModule
],
providers: [
AuthguardService,
LoginService
],
declarations: [
AppComponent,
],
exports: [
],
bootstrap: [AppComponent],
})
export class AppModule { }
AuthguardService
import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { LoginService } from './mymodule/login';
@Injectable()
export class AuthguardService implements CanActivate {
constructor(
private service: LoginService,
private router: Router
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean{
let url: string = state.url;
return this.checkLogin(url);
}
private checkLogin(url: string){
debugger;
if (this.service.isLoggedIn()) {
console.log(this.service.loggedIn);
return true;
} else {
console.log(this.service.loggedIn);
this.router.navigate(['/']);
return false;
}
}
}
LoginService
:後は私のコードスニペットです
import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Injectable()
export class LoginService {
loggedIn: boolean = false;
constructor(
http: Http
){}
login(username: string, password: string){
let header = new Headers({
'Content-Type': 'application/json',
'Accept': 'application/json',
});
return this.http.post(
'http://localhost/api/login',
JSON.stringify({login:username,password:password}),
{headers: headers}).map((res: Response)=>{
this.loggedIn = true;
return res.json();
})
.catch(this.handleError);
}
logout(){
this.loggedIn = false;
}
isLoggedIn(){
if(this.loggedIn == true){
return true;
} else {
return false;
}
}
private handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
}
誰でも私がここで間違っていることを教えてもらえますか?ログインコンポーネントからログインサービスを呼び出すと、ログインは正常に実行され、loggedIn変数はtrueに設定されますが、他のルートにリダイレクトしようとするとAuthguardServiceがログインサービスを使用するとloggedInの値はfalseになります。ログインサービスのプロバイダが複数ある場合は、すべてのモジュールクラスをチェックしましたが、そうではありません。
何か助けていただければ幸いです。
サービスを他のルートにリダイレクトして再作成していますか?そのサービスを実装するために、シングルトンデザインパターン(https://en.wikipedia.org/wiki/Singleton_pattern)を使用してみてください。次に、1つのオブジェクトを作成し、すべての要求に戻します。私はそれがうまくいくと思います。 :) –
私はangle2のシングルトンサービスに関する多くの記事を読んでいます。彼らはすべてangular2がHIERARCHICAL DEPENDENCY INJECTIONを使用すると言っています。サービスクラスの同じインスタンスを使用する必要がある場合は、ルートレベルでのみ提供し、他のモジュールやコンポーネントからメタデータを削除する必要があります。しかし、私はまだ結果を得ることができません。 –
static(static loggedIn:boolean = false)としてloggedIn変数を試してください。私はそれが動作する薄い:) –