gpt4 book ai didi

angular - Observable 订阅方法仅被调用一次

转载 作者:行者123 更新时间:2023-12-02 10:48:06 26 4
gpt4 key购买 nike

我正在构建一个简单的 Angular 应用程序,我希望服务能够保持某种状态。我的第一次尝试只是一个 bool 值登录。基本上,我希望导航栏组件订阅该值,以便当其为 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 的提供者中声明,而不是在其他地方。

关于angular - Observable 订阅方法仅被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44272119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com