首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BehaviorSubject冷漠行为

BehaviorSubject冷漠行为
EN

Stack Overflow用户
提问于 2018-06-14 12:13:16
回答 2查看 960关注 0票数 0

在我的角6项目,我有3个组成部分,登录,注册和家庭。

当用户在应用程序中成功注册时,我想在绿色区域内显示这条“注册成功”消息。为此,我在shared.service.ts中制作了一个shared.service.ts

代码语言:javascript
复制
private isRegistrationSuccessfully: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);

/* Successful registration */
  getSuccessMessage(): Observable<boolean> {
    return this.isRegistrationSuccessfully.asObservable();
  }

  setSuccessMessage(value: boolean): void {
    this.isRegistrationSuccessfully.next(value);
  }

在成功注册的register.component.ts文件中,我调用set方法,

代码语言:javascript
复制
onSubmitRegistrationForm() {
// some code
this._sharedService.setSuccessMessage(true);
this._router.navigate(['/' + RouteConstants.LOGIN]);
}

在login.component.ts文件中,我调用getSuccessMessage()方法,

代码语言:javascript
复制
successMessageSubscriber: any;

ngOnInit() {
    this.successMessageSubscriber = this._sharedService.getSuccessMessage().subscribe((flag) => {
      if (flag) {
          // code for showing div
      }
    });
  }

ngOnDestroy() {
    if (this.successMessageSubscriber) {
      this.successMessageSubscriber.unsubscribe();
    }
  }

根据这段代码,注册成功后,我将得到预期的结果,如果刷新页面,getSuccessMessage()也会返回false,这也是预期的结果。但是在成功注册和登录之后(重定向到home组件),如果我立即退出,我仍然获得了getSuccessMessage()的真正价值。这应该是真的吗?还是我在这里漏掉了什么?

编辑

还有什么其他的/更好的方法,我可以做这个操作,有或没有行为主题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-14 13:03:07

角服务是单子(默认情况下)。此外,当您调用router.navigate路由到另一个页面时,一些组件将被销毁,但服务不会被破坏。只要您停留在您的站点路径内,每次导航时重新加载整个应用程序都是没有意义的。

这对人们来说是令人惊讶的,因为URL有时会改变。但是,URL更改并不需要重新加载页面。

但是,当您刷新页面或导航到外部页面并返回时(就像在openid连接工作流中那样),则会重新加载整个应用程序。

无论如何,如果你正在寻找一个更好的方法采取,那么只需发送真假到你的行为主题立即。您的组件将获得两个值,但不对false执行任何操作。然后,当您导航时,组件将被销毁(服务是单个的,但组件不是)并重新创建,当新的组件读取时,它将读取false。

您也可以使用简单的主题而不是BehaviorSubject。

票数 1
EN

Stack Overflow用户

发布于 2018-06-14 13:20:42

加载登录页时,执行订阅方法。这将显示消息‘注册成功’,因为标志始终为真。

代码语言:javascript
复制
  ngOnInit() {
    this.successMessageSubscriber = this._sharedService.getSuccessMessage().subscribe((flag) => {
        if (flag) {
            this.message="successfully registered";
        }
    });
  }

解决方案是在服务中添加另一个方法来清除标志。

代码语言:javascript
复制
clearMessage(): void {
  this.isRegistrationSuccessfully.next(false);
}

然后在取消订阅之前调用此方法。

代码语言:javascript
复制
  ngOnDestroy() {
      if (this.successMessageSubscriber) {
        this._sharedService.clearMessage();
        this.successMessageSubscriber.unsubscribe();
      }
  }

加载登录时,将订阅消息。当登录被卸载时,消息被取消订阅。该标志未提前清除。此代码更改将重置标志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50857301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档