Angular2 : Using routes, 登录成功后如何显示导航栏?

标签 angular typescript angular2-routing

一旦用户成功显示,我将尝试显示导航栏。

例如:

如何更改“LoginComponent”中“AppComponent”中的“showMenu”属性?重要提示:我正在使用路由。

应用.ts:

@Component({
  selector: 'app',
  template: `<div *ngIf="showMenu">
               <fnd-menu-nav></fnd-menu-nav>
             </div>
             <router-outlet></router-outlet>
              `,
  directives: [ROUTER_DIRECTIVES, MenuNavComponent]
})
@RouteConfig([
  { path: '/login', name: 'Login', component: LoginComponent, useAsDefault: true },
  { path: '/welcome', name: 'Welcome', component: WelcomeComponent }
])
export class AppComponent {
  public showMenu : boolean;
}

登录.component.ts:

@Component({
  selector: 'fnd-login',
  templateUrl: './fnd/login/components/login.component.html',
  providers: [LoginService]
})
export class LoginComponent {
  /* .. other properties */

  constructor(private _router: Router, private _loginService: LoginService ) {
  }
  /* .. other methods  */
  /* .. other methods  */


  private onLoginSuccessfully(data : any) : void {
    /* --> HERE: Set showMenu in AppComponent to true. How? */
    this._router.navigate(['Welcome']);

  }
}

或者这个设计不是最好的解决方法?

最佳答案

我最近做了类似的事情,下面是我的做法。首先,您需要在应用的根目录创建一个 NavBarComponent。在 NavBarComponent 中,您引用(我称之为)一个 GlobalEventsManager,它是您在需要的地方注入(inject)的服务。

下面是 GlobalEventsManager:

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

@Injectable()
export class GlobalEventsManager {

    private _showNavBar: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
    public showNavBarEmitter: Observable<boolean> = this._showNavBar.asObservable();

    constructor() {}

    showNavBar(ifShow: boolean) {
        this._showNavBar.next(ifShow);
    }


}

现在您将 GlobalEventsManger 服务注入(inject)您的登录组件(类似这样)

import {GlobalEventsManager} from "./../GlobalEventsManager";

@Component({
  selector: 'fnd-login',
  templateUrl: './fnd/login/components/login.component.html',
  providers: [LoginService]
})
export class LoginComponent {
  /* .. other properties */

  constructor(private _router: Router, private _loginService: LoginService, private globalEventsManager: GlobalEventsManager) {
  }
  /* .. other methods  */
  /* .. other methods  */


  private onLoginSuccessfully(data : any) : void {
    /* --> HERE: you tell the global event manger to show the nav bar */
    this.globalEventsManger.showNavBar(true);
    this._router.navigate(['Welcome']);

  }
}
在您的 NavBarComponent 中,您订阅了 showNavBar 事件发射器:

import {Component, OnInit} from "@angular/core";
import {GlobalEventsManager} from "../GlobalEventsManager";
@Component({
    selector: "navbar",
    templateUrl: "app/main/topNavbar/TopNavbar.html"
})

export class TopNavbarComponent  {
    showNavBar: boolean = false;


    constructor(private globalEventsManager: GlobalEventsManager) { 
        this.globalEventsManager.showNavBarEmitter.subscribe((mode)=>{
            
            this.showNavBar = mode;
        });
        
    }

 
}
在模板 HTML 中使用 *ngIf="showNavBar"来隐藏/显示导航栏。

您的应用程序组件看起来像这样:

@Component({
  selector: 'app',
  template: `<navbar></navbar>
             <router-outlet></router-outlet>
              `
})
export class AppComponent {
  //This doesn't belong here --> public showMenu : boolean;
}

还必须在启动应用程序时注册 GlobalEventsManager:

import { GlobalEventsManager } from './GlobalEventsManager';
import { TopNavbarComponent } from './TopNavbarComponent';

@NgModule({
    bootstrap: [App],
    declarations: [
        App,
        TopNavbarComponent
    ],
    imports: [
        BrowserModule
    ],
    providers: [GlobalEventsManager]
})
export class AppModule {
}

应该可以了。

更新:我已经更新了这个答案以反射(reflect)在组件外部(即在服务中)使用事件的更可接受的方式;这需要使用 BehaviorSubject/Observable 而不是 EventEmitter

关于Angular2 : Using routes, 登录成功后如何显示导航栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36665094/

相关文章:

Angular:如何在 PrimeNG p-steps 组件中设置已完成步骤的样式?

angular - ngrx - 链接两个 store.select 切片

typescript - Angular 2 - 直接从 Observable 返回数据

Angular 2 : How to find out what was previous page url when using angular2 routing

typescript - Angular2 观察路线变化

javascript - CLI 中 --poll 标志的作用是什么

typescript - Angular2 http 缺少 .map 函数

javascript - ngFor 使用唯一键进行迭代

javascript - 在 AppModule 中导入模块以实现 Angular2 中的关注点分离

angular - 如何在 Angular2 中处理多个查询参数