简体   繁体   English

基于用户类型的Angular 4动态标题

[英]Angular 4 dynamic headers based on user type

I'm trying to implement a dynamic header component which changes based on user role. 我正在尝试实现一个动态标头组件,该组件根据用户角色而变化。

Here is my header component 这是我的标头组件

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {
    currentUser:any;
  constructor(

  ) {
     this.currentUser = JSON.parse(localStorage.getItem('currentUser')); 

  }

  ngOnInit() {

  }

}

This is my header template 这是我的标题模板

<nav class="navbar navbar-default" >
 <div class="collapse navbar-collapse" id="myNavbar">
  <ul class="nav navbar-nav navbar-right">
    <li class="menu_item" *ngIf="!currentUser"><a [routerLink]="['/login']"> Login </a></li>
    <li class="menu_item" *ngIf="currentUser"><a [routerLink]="['/signin']">Logout</a></li>
  </ul>
</div>
</nav>

But the problem is 但是问题是

  • after logged in, that header text is not changing ( not changing login -> logout ) 登录后,该标题文本没有更改(不更改login-> logout)
  • after logout, that header text is not changing ( not changing logout -> login ) 注销后,该标题文本没有更改(不更改注销-> login)
  • But it change the header text if I refresh the page. 但是,如果我刷新页面,它将更改标题文本。 But not changing automatically with the route change 但不会随着路线的改变而自动改变

Can anyone help me on this ? 谁可以帮我这个事 ?

You need to let the HeaderComponent know that the authentication status has changed. 您需要让HeaderComponent知道身份验证状态已更改。 You could use an observable for this: 您可以为此使用可观察的:

  1. introduce isAuthenticated$ observable inside AuthService AuthService内部引入isAuthenticated$

  2. inject that service in HeaderComponent, and use the isAuthenticated$ inside the template, with async pipe 将服务注入HeaderComponent,并在模板内使用isAuthenticated$ ,并使用异步管道

  3. when logging in/out, call next() on that observable to trigger changes 登录/注销时,在该可观察对象上调用next()以触​​发更改

Something like this should do the job: 像这样的事情应该做的工作:

class AuthService {

    isAuthenticated$ = new BehaviorSubject<boolean>(false);

    constructor() {
        const authenticated = !!JSON.parse(localStorage.getItem('currentUser')); 
        this.isAuthenticated$.next(authenticated);
    }

    login() {
        this.isAuthenticated$.next(true);
    }

    logout() {
        this.isAuthenticated$.next(false);
    }

}

Header component controller: 标头组件控制器:

class HeaderComponent implements OnInit {

  public currentUser: any;
  public isAuthenticated$ = this.auth.isAuthenticated$;

  private (private auth: AuthService) {}

  ngOnInit() {
    this.isAuthenticated$.subscribe(authenticated => {
      if (authenticated) {
        this.currentUser = JSON.parse(localStorage.getItem('currentUser')); 
      } else {
        this.currentUser = null;
      }
    });
  }

}

Your template: 您的模板:

<nav class="navbar navbar-default" >
  <div class="collapse navbar-collapse" id="myNavbar">
    <ul class="nav navbar-nav navbar-right">
      <li class="menu_item" *ngIf="!(isAuthenticated$ | async)"><a [routerLink]="['/login']"> Login </a></li>
      <li class="menu_item" *ngIf="(isAuthenticated$ | async) && currentUser.someField === 'someValue'"><a [routerLink]="['/signin']">Logout</a></li>
    </ul>
  </div>
</nav>

Please use ng-template 请使用ng-template

  `  <ul class="navbar-nav">
                <ng-template #anonymousUser>
                  <li class="nav-item">
                    <a class="nav-link" routerLink="/login">Login</a>
                  </li>
                </ng-template>

                <li ngbDropdown *ngIf="appUser ;else anonymousUser " class="nav-item dropdown ">
                  <a ngbDropdownToggle class="nav-link dropdown-toggle" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    {{appUser.name}}</a>
                  <div ngbDropdownMenu class="dropdown-menu " aria-labelledby="dropdown01">
                    <a class="dropdown-item" routerLink="/my/orders">My Orders</a>
                    <ng-container *ngIf="appUser.isAdmin">
                      <a class="dropdown-item" routerLink="/admin/orders">Manage Order</a>
                      <a class="dropdown-item" routerLink="/admin/products">Manage Products</a>
                    </ng-container>

                    <a class="dropdown-item" (click)=logOut()>Log Out</a>
                  </div>
                </li>
              </ul>`

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM