簡體   English   中英

可觀察的訂閱方法僅被調用一次

[英]Observable subscribe method only getting called once

我正在構建一個簡單的角度應用程序,在該應用程序中我希望服務保持某種狀態。 我的第一次嘗試只是一個布爾值loginIn。 基本上,我希望導航欄組件訂閱此值,以便當其值為false時顯示“登錄”選項,而當其值為true時顯示“管理”按鈕。

我的服務:

@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()之類的方法,但無濟於事。

您在NavComponent的提供程序中添加了AuthService。 因此,它具有自己的AuthService特定實例,與身份驗證組件所使用的實例不同。

該服務必須是單例,由應用程序中的所有組件共享。 因此,應該在根NgModule的提供程序中聲明它,而在其他地方沒有聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM