可观察的订阅方法只被调用一次
Observable subscribe method only getting called once
我正在构建一个简单的 angular 应用程序,我希望其中的服务保持某种状态。我的第一次尝试只是一个布尔登录。基本上,我想要一个导航栏组件订阅这个值,以便当它为 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');
});
}
}
现在我在应用程序启动时看到控制台输出,但在登录后看不到 returns。为什么导航组件中的订阅函数只被调用一次(页面确实导航到 /admin 所以我知道服务中的订阅被调用)?这与 hot/cold 可观察量有关吗?我试过使用 .publishLast().refCount() 之类的东西,但无济于事。
您在 NavComponent 的提供程序中添加了 AuthService。因此它有自己的特定 AuthService 实例,与您的身份验证组件使用的实例不同。
此服务必须是单例,由应用程序中的所有组件共享。所以它应该在根 NgModule 的提供者中声明,而不是在其他任何地方。
我正在构建一个简单的 angular 应用程序,我希望其中的服务保持某种状态。我的第一次尝试只是一个布尔登录。基本上,我想要一个导航栏组件订阅这个值,以便当它为 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');
});
}
}
现在我在应用程序启动时看到控制台输出,但在登录后看不到 returns。为什么导航组件中的订阅函数只被调用一次(页面确实导航到 /admin 所以我知道服务中的订阅被调用)?这与 hot/cold 可观察量有关吗?我试过使用 .publishLast().refCount() 之类的东西,但无济于事。
您在 NavComponent 的提供程序中添加了 AuthService。因此它有自己的特定 AuthService 实例,与您的身份验证组件使用的实例不同。
此服务必须是单例,由应用程序中的所有组件共享。所以它应该在根 NgModule 的提供者中声明,而不是在其他任何地方。