Angular 下一次调用时未调用角度订阅

Angular 下一次调用时未调用角度订阅,angular,observable,behaviorsubject,Angular,Observable,Behaviorsubject,我正在尝试实现自动登录系统,我将登录数据保存到本地存储,以便在刷新时从本地存储获取数据 当我从localstorage获取数据时,我使用Subject发出该数据,以便在header组件中订阅数据并在刷新时保持应用程序状态 现在在刷新时,我的autologin函数正在获得调用,但订阅并没有在头组件中调用 身份验证服务代码 autoLogin(){ const userdata: { email:string; id: string;

我正在尝试实现自动登录系统,我将登录数据保存到本地存储,以便在刷新时从本地存储获取数据 当我从localstorage获取数据时,我使用Subject发出该数据,以便在header组件中订阅数据并在刷新时保持应用程序状态

现在在刷新时,我的autologin函数正在获得调用,但订阅并没有在头组件中调用

身份验证服务代码

    autoLogin(){
    const userdata: {
        email:string;
        id: string;
        _token:string;
        _tokenExpairDate:Date;
    }=JSON.parse(localStorage.getItem('userData'));
    if(!userdata){
      return;
    }
    console.log("Auto Login Call");
    
    const loadedData=new User
    (
      userdata.email,
      userdata.id,
      userdata._token,
      new Date
      (
        userdata._tokenExpairDate
      )
    );
    if(loadedData.token){
      console.log(loadedData);
      console.log("data Emmit");
      this.user.next(loadedData);
    }
    else{
      console.log("data Not Emmit");
    }
 }
标题组件代码


我不确定您实际上是如何设置可观察的,但这可能会对您有所帮助

// In user.modal.ts export a interface for the user
// You need to define this so that you dont need to repeat your code

export interface User {
    email:string;
    id: string;
    _token:string;
    _tokenExpairDate:Date;
}
************************************
// In your service file, do this: 

import { User } from './user.modal.ts';

let initialUserDetails: User = {};

private userDetailsSource: BehaviorSubject<User> = new BehaviorSubject<User>(this.initialUserDetails);

public userDetailsObservable: Observable<User> = this.userDetailsSource.asObservable();

setUserDetails(userDetails: User) {
    this.userDetailsSource.next(userDetails);
}

getUserDetails(): Observable<User> {
    return this.userDetailsObservable;
}

********************************
// In your component.ts file, whenever you want to set the details: 

if (loadedData.token) {
    console.log(loadedData);
    console.log("data Emmit");
    this.user.next(loadedData); // Dont do this:

    this.yourServiceName.setUserDetails(loadedData); // Do this;
}


// Whenever you want to get the details of the Observable, you can do this: 

this.yourServiceName.getUserDetails().subscribe(subscribedData => {
    console.log('Latest Observable Data =>', subscribedData);
})

//在user.modal.ts中为用户导出一个界面
//您需要定义它,这样就不需要重复代码
导出接口用户{
电子邮件:字符串;
id:字符串;
_令牌:字符串;
_tokenExpairDate:日期;
}
************************************
//在服务文件中,执行以下操作:
从'./User.modal.ts'导入{User};
让initialUserDetails:User={};
private userDetailsSource:BehaviorSubject=新的BehaviorSubject(this.initialUserDetails);
public userDetailsObservable:Observable=this.userDetailsSource.asObservable();
setUserDetails(userDetails:User){
this.userDetailsSource.next(userDetails);
}
getUserDetails():可观察{
返回this.userDetailsObservable;
}
********************************
//在component.ts文件中,每当您要设置详细信息时:
如果(loadedData.token){
console.log(loadedData);
console.log(“数据Emmit”);
this.user.next(loadedData);//不要这样做:
this.yourServiceName.setUserDetails(loadedData);//执行此操作;
}
//无论何时,只要您想获得可观察对象的详细信息,您都可以这样做:
此.yourServiceName.getUserDetails().subscribe(subscribedData=>{
console.log('Latest observeable Data=>',subscribedData);
})

我不确定您实际是如何设置可观察的,但这可能会对您有所帮助

// In user.modal.ts export a interface for the user
// You need to define this so that you dont need to repeat your code

export interface User {
    email:string;
    id: string;
    _token:string;
    _tokenExpairDate:Date;
}
************************************
// In your service file, do this: 

import { User } from './user.modal.ts';

let initialUserDetails: User = {};

private userDetailsSource: BehaviorSubject<User> = new BehaviorSubject<User>(this.initialUserDetails);

public userDetailsObservable: Observable<User> = this.userDetailsSource.asObservable();

setUserDetails(userDetails: User) {
    this.userDetailsSource.next(userDetails);
}

getUserDetails(): Observable<User> {
    return this.userDetailsObservable;
}

********************************
// In your component.ts file, whenever you want to set the details: 

if (loadedData.token) {
    console.log(loadedData);
    console.log("data Emmit");
    this.user.next(loadedData); // Dont do this:

    this.yourServiceName.setUserDetails(loadedData); // Do this;
}


// Whenever you want to get the details of the Observable, you can do this: 

this.yourServiceName.getUserDetails().subscribe(subscribedData => {
    console.log('Latest Observable Data =>', subscribedData);
})

//在user.modal.ts中为用户导出一个界面
//您需要定义它,这样就不需要重复代码
导出接口用户{
电子邮件:字符串;
id:字符串;
_令牌:字符串;
_tokenExpairDate:日期;
}
************************************
//在服务文件中,执行以下操作:
从'./User.modal.ts'导入{User};
让initialUserDetails:User={};
private userDetailsSource:BehaviorSubject=新的BehaviorSubject(this.initialUserDetails);
public userDetailsObservable:Observable=this.userDetailsSource.asObservable();
setUserDetails(userDetails:User){
this.userDetailsSource.next(userDetails);
}
getUserDetails():可观察{
返回this.userDetailsObservable;
}
********************************
//在component.ts文件中,每当您要设置详细信息时:
如果(loadedData.token){
console.log(loadedData);
console.log(“数据Emmit”);
this.user.next(loadedData);//不要这样做:
this.yourServiceName.setUserDetails(loadedData);//执行此操作;
}
//无论何时,只要您想获得可观察对象的详细信息,您都可以这样做:
此.yourServiceName.getUserDetails().subscribe(subscribedData=>{
console.log('Latest observeable Data=>',subscribedData);
})

您是否也可以在“注册”AuthService的位置提供代码modules@Injectable({providedIn:'root'})导出类AuthServiceService{您是否也将其放在
providers
部分的任何位置?现在没有,但我也在app.modulesis
console.log(“订阅调用”)中尝试
正在执行?您是否也可以在“注册”AuthService的位置提供代码modules@Injectable({providedIn:'root'})导出类AuthServiceService{您是否也将其放在
providers
部分的任何位置?现在没有,但我也在app.modulesis
console.log(“订阅调用”)中尝试
正在执行?请注意,使用BehaviorSubject时,当您订阅它时,您可能会收到init值(此处
{}
),然后接收带有真实数据的第二个事件。因此,您应该在subscribe中添加一个检查。这就是为什么我们经常使用
null
作为init值的原因,因此很容易忽略。请注意,使用BehaviorSubject,当您订阅它时,您可能会收到init值(此处
{}
),然后接收带有真实数据的第二个事件。因此,您应该在订阅中添加一个检查。这就是我们经常使用
null
作为初始值的原因,因此很容易忽略它。