【问题标题】:Angular 8: Can't correctly get value from serviceAngular 8:无法正确地从服务中获取价值
【发布时间】:2020-05-10 22:20:36
【问题描述】:

我有一个简单的身份验证服务,仅用于测试,因为我正在学习设置 localStorage 值的 Angular

一般服务:

isAuthenticated = new Subject();
autoLogin = new Subject();

身份验证服务:

if (response.message === 'Logged in') {
    localStorage.setItem('isLoggedIn', '1');
    this.generalS.isAuthenticated.next(true);
  } else {
    this.generalS.isAuthenticated.next(false);
  }

认证组件

isAuthSub: Subscription;
// in the submit function ...
this.authS.login(userData);
this.isAuthSub = this.generalS.isAuthenticated.subscribe( (data) => {
  if (data) {
    console.log('Yes');
    this.route.navigate(['recipes']);
  } else {
    console.log('No');
  }
});

在控制台中我得到Yes

在应用组件中

const isLoggedIn = localStorage.getItem('isLoggedIn');
if (!isLoggedIn || isLoggedIn !== '1') {
  this.generalS.autoLogin.next(false);
  this.generalS.isAuthenticated.next(false);
} else {
  console.log('loggenInValue: ' + isLoggedIn);
  this.generalS.autoLogin.next(true);
  this.generalS.isAuthenticated.next(true);
}

我在控制台中得到了这个

loggenInValue: 1

所以 autoLogin 和 isAuthenticated 主题应该持有 true 作为值

我在标题组件中侦听此值以显示或隐藏login 链接,但它不记录任何内容

在标题组件中

authSub: Subscription;
isAuthenticated: boolean;
ngOnInit() {
  this.authSub = this.generalS.isAuthenticated.subscribe( (data: boolean) => {
    this.isAuthenticated = data;
    console.log('authenticated: ' + data);
  });
}

我没有从这部分得到任何日志。关于解决这个问题的任何想法? [我知道我不应该像这样检查自动登录功能,而只是为了测试检查 localStorage 值并根据它更改其他值]

【问题讨论】:

    标签: angular service rxjs local-storage subscription


    【解决方案1】:

    因为我不知道代码在您的 authService 中的确切位置。我假设您在订阅之前调用 next(),这意味着还没有任何订阅者。 Subjects 只会向现有的订阅者发出事件,而不是未来的。

    如果您只想获得订阅的最新价值,可以轻松切换到 ReplaySubject:

    isAuthenticated = new ReplaySubject(1);
    autoLogin = new ReplaySubject(1);
    

    https://rxjs-dev.firebaseapp.com/api/index/class/ReplaySubject

    【讨论】:

    • 在应用程序组件中我已经获得了 localStorage 值并且它是正确的然后我使用“next”在服务中设置值,然后在我订阅并获取它的标头组件中。这是错的吗?
    • 当你调用 next() 时,你并不是在“设置”一个值。您正在发出一个值。因此,如果没有人订阅或收听,他们就不会得到你的价值。有点像那句话:如果一棵树倒在空旷的森林里,它会发出声音吗?有点像。如果您使用我的建议,它会重播您发送给新订阅者的最后一个值。
    • 我应用了它,它工作正常。非常感谢。
    猜你喜欢
    • 2019-11-10
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多