【问题标题】:Observable subscribe method only getting called once可观察的订阅方法只被调用一次
【发布时间】:2017-10-31 12:16:55
【问题描述】:

我正在构建一个简单的 Angular 应用程序,我希望服务在其中保持某种状态。我的第一次尝试只是一个布尔登录。基本上,我想要一个导航栏组件订阅这个值,这样当它为假时它显示一个“登录”选项,当它为真时显示一个“管理”按钮。

我的服务:

@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');
    });
  }

}

现在我在应用程序启动时看到控制台输出,但在登录返回后看不到。为什么导航组件中的订阅功能只被调用一次(页面确实导航到 /admin 所以我知道正在调用服务中的订阅)?这与热/冷可观察对象有关吗?我试过使用 .publishLast().refCount() 之类的东西,但无济于事。

【问题讨论】:

    标签: angular angular2-observables


    【解决方案1】:

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

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

    【讨论】:

    • 是的。似乎就是这样。我想我已经添加了这样的提供程序,因为它似乎摆脱了关于无法解析服务的构造函数参数的 ts 错误。方便的是,我不再看到该错误了。哦,好吧,学到了一些新东西。谢谢!
    猜你喜欢
    • 2021-05-30
    • 2017-10-06
    • 1970-01-01
    • 2021-06-14
    • 2017-06-21
    • 2017-04-13
    • 2018-03-24
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多