只能调用

时间:2017-05-30 21:22:52

标签: angular angular2-observables

我正在构建一个简单的角度应用程序,其中我希望服务保持某种状态。我第一次尝试这只是一个布尔记录。基本上,我想要一个navbar组件来订阅这个值,这样当它为false时它会显示一个'login'选项,当它的true显示一个'admin'按钮时。

我的服务:

@Injectable()
export class AuthService {
  private _loggedIn = new BehaviorSubject(false);
  public readonly loggedIn$ = this._loggedIn.asObservable();

  constructor(private http: Http, private router: Router) { 
    this._loggedIn = new BehaviorSubject(false);
  }

  public login(u: User): Observable<any> {
    let obs = this.http.post(ApiRoutes.login, u).map(res => res.json());

    obs.subscribe(res => {
      this._loggedIn.next(res.success);

      if (this._loggedIn.getValue())
        this.router.navigate(['/admin']);
    });

    return obs;
  }
}

在我的导航组件中:

@Component({
  selector: 'app-nav',
  templateUrl: './nav.component.html',
  styleUrls: ['./nav.component.scss'],
  providers: [AuthService]
})
export class NavComponent implements OnInit {
  loggedIn: boolean;

  constructor(private as: AuthService) { }

  ngOnInit() {
    this.as.loggedIn$.subscribe(isLoggedIn => {
      this.loggedIn = isLoggedIn;
      console.log('from nav ' + isLoggedIn);
    }, err => {
      console.log(err);
    }, () => {
      console.log('complete');
    });
  }

}

现在我在应用启动时看到控制台输出,但在登录返回后没有看到。为什么nav组件中的subscribe函数只被调用一次(页面导航到/ admin所以我知道正在调用服务中的订阅)?这与热/冷可观测量有关吗?我尝试过使用像.publishLast()。refCount()这样的东西但无济于事。

1 个答案:

答案 0 :(得分:5)

您在NavComponent的提供程序中添加了AuthService。因此它有自己的特定AuthService实例,与您的身份验证组件使用的实例不同。

此服务必须是单例,由应用程序中的所有组件共享。所以它应该在根NgModule的提供者中声明,而不是其他地方。