Angular 订阅不会在 Next 上调用

标签 angular observable behaviorsubject

我正在尝试实现一个自动登录系统,将登录数据保存到本地存储,以便在刷新时从本地存储获取数据。

当我从本地存储获取数据时,我使用Subject发出该数据,以便在 header 组件中我订阅数据并在刷新时保持应用程序状态。

现在刷新时,我的自动登录函数被调用,但订阅未在 header 组件中调用

AuthService Code

    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");
    }
 }

header component code

ngOnInit(){
    this.userSub=this.auth.user.subscribe(user=>{
      console.log("Subscription Call");
      this.isLogin=!user? false:true;
    })
  }

最佳答案

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

// 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);
})

关于Angular 订阅不会在 Next 上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67387453/

相关文章:

java - 链接没有显着返回值的 Observable

angular - 如何使用 BehaviourSubjects 在 Angular 组件之间共享 API 调用的数据?

java-8 - 如何使用 Observables 迭代列表中的所有项目

angular - 为什么组件中的 ', providers: [TravelService] ' 会阻止 RXJS 行为主体跨组件共享数据?

angular - 在 Angular/RXJS 中向对象数组的 Observable 添加/删除对象?

angular - 给 BehaviorSubject 初始值 - 值是一个 Observable

angular - Ionic 2 auth - 如果本地存储上有用户,则跳过登录页面

javascript - 上传图片并显示预览

angular - 在对话框中重用组件的 Angular 、 Material 的最佳实践?

angular - 如何在不使用构造函数 DI 的情况下创建 Http 实例? (RC.5+)