javascript - 如何在不刷新整个页面的情况下更新组件 - Angular

标签 javascript angular refresh angular-components

我的页面结构是:

<app-header></app-header>
<router-outlet></router-outlet>
<app-footer></app-footer>

如何在不刷新整个页面的情况下更新/刷新 app-header 组件?

一旦用户成功登录,我想在标题中隐藏一个“登录”链接。标题在所有组件/路由中都是通用的。

最佳答案

您可以使用 BehaviorSubject 用于在整个应用程序的不同组件之间进行通信。您可以定义包含 BehaviorSubject 的数据共享服务 您可以订阅并发出更改。

定义数据共享服务

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class DataSharingService {
    public isUserLoggedIn: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
}

添加 DataSharingService 在你的 AppModule 提供商条目。

接下来,导入 DataSharingService在你的<app-header>以及您执行登录操作的组件中。在 <app-header>订阅对 isUserLoggedIn 的更改主题:

import { DataSharingService } from './data-sharing.service';

export class AppHeaderComponent { 
    // Define a variable to use for showing/hiding the Login button
    isUserLoggedIn: boolean;

    constructor(private dataSharingService: DataSharingService) {

        // Subscribe here, this will automatically update 
        // "isUserLoggedIn" whenever a change to the subject is made.
        this.dataSharingService.isUserLoggedIn.subscribe( value => {
            this.isUserLoggedIn = value;
        });
    }
}

在你的<app-header> html模板,你需要添加*ngIf条件例如:

<button *ngIf="!isUserLoggedIn">Login</button> 
<button *ngIf="isUserLoggedIn">Sign Out</button>

最后,您只需要在用户登录后发出事件,例如:

someMethodThatPerformsUserLogin() {
    // Some code 
    // .....
    // After the user has logged in, emit the behavior subject changes.
    this.dataSharingService.isUserLoggedIn.next(true);
}

关于javascript - 如何在不刷新整个页面的情况下更新组件 - Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46047854/

相关文章:

javascript - Jquery模态窗口仅在输入值长度大于2时显示

javascript - 如何通过JavaScript使用F11键事件使浏览器全屏

html - 浏览器刷新行为

javascript - 当可以访问 DOM 时需要回调

android - 发送到本地 IP 地址时出现明文错误 - Android 9

python - 如何让 Excel RefreshAll 等待完成才能关闭?

javascript - 如何在刷新页面时显示提示信息

javascript - 序列化 JSON 对象以通过 AJAX 发送

javascript - 将win1250编码的字符串更改为utf8

后端的 Angular-CLI 代理不起作用