在 angular2 中使用应用程序范围的单个服务实例

Using application wide single instance of service in angular2

我正在制作 Angular2 应用程序。我有一个登录服务class,它是在应用程序级别提供的,供登录组件和身份验证保护服务使用。

如果我对 DI 的理解是正确的,一旦通过 AppModule 的提供者元数据在应用程序级别提供服务,在注入时,将向所有组件提供相同的服务实例,从而更改成员一个组件的服务 class 将反映在另一个服务或组件 class.

我在应用程序级别提供了登录服务 class 但是从一个组件更改服务的成员变量并没有反映在其他组件中。我的登录组件将 loggedIn 变量更改为 true,但是当我从 auth guard 服务访问它时,它仍然得到 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;
        }
    }
}

登录服务

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。我检查了所有模块class是否有多个登录服务提供商但没有。

感谢任何帮助。

如果您将服务添加到 module.ts

以外的任何其他组件的提供程序数组中,则可能会发生这种情况

看来是我提交表单的方式有问题。我在单击按钮而不是 (ngSubmit) 时调用了 login() 方法,因此当我单击登录按钮时,首先会触发单击事件,然后触发提交事件。提交事件正在重新加载整个应用程序,导致它创建所有内容的新实例。始终使用 (ngSubmit) 事件提交表单。