代码之家  ›  专栏  ›  技术社区  ›  Krishna Chaitanya

如何在角度组件之间共享数据?

  •  0
  • Krishna Chaitanya  · 技术社区  · 6 年前

    我有一个登录组件,负责验证用户。在authenticate web服务的响应中,我们接收到一个api密钥,该密钥应该在每个后续请求中发送。

    用户登录后,我们将路径从/login更改为/dashboard。

    现在在我的仪表板组件中,我正在注入登录组件并调用getApiKey函数,该函数返回undefined。下面是代码

    import { Component, OnInit, Injectable } from '@angular/core';
    import { User } from '../domain/User';
    import { HttpClient, HttpHeaders } from '@angular/common/http';
    import { LoginResponse } from '../domain/LoginResponse'
    
    @Component({
      selector: 'app-login',
      templateUrl: './login.component.html',
      styleUrls: ['./login.component.css']
    })
    @Injectable()
    export class LoginComponent implements OnInit {
    
      private user:User = new User();
    
      private xSSOFamilyId:string = 'BOMO';
    
      private apiKey:string;
    
      constructor(private httpClient: HttpClient) { }
    
      ngOnInit() {
      }
    
      login(): void {
    
        var authorization:string = 'Basic ' + btoa(this.user.cwopa + ":" + this.user.password);
        var httpHeaders = new HttpHeaders({
          'Authorization': authorization,
          'userId': this.user.cwopa,
          'X-SSO-Family-Id': this.xSSOFamilyId
        });
        this.httpClient.post<LoginResponse>('http://localhost:8081/web-beginner/authenticate', undefined, {headers: httpHeaders}).subscribe(response => {
          this.apiKey = response.apiKey;
          console.log(this.apiKey)
          window.location.href = "dashboard";
        }, error => {
          console.log("error occured");
        });
      }
    
      public getApiKey(): string {
        return this.apiKey;
      }
    }
    

    仪表板.component.ts

    import { Component, OnInit } from '@angular/core';
    
    import {LoginComponent} from "../login/login.component"
    
    @Component({
      selector: 'app-dashboard',
      templateUrl: './dashboard.component.html',
      styleUrls: ['./dashboard.component.css'],
      providers: [LoginComponent]
    })
    export class DashboardComponent implements OnInit {
    
      constructor(public loginComponent: LoginComponent) { }
    
      ngOnInit() {
      }
    
      authorize(appName:string): void {
        console.log(this.loginComponent.getApiKey())
      }
    }
    

    我正在考虑使用会话存储来设置api密钥,然后从仪表板组件读取api密钥。这样好还是有更好的解决办法?

    有人能告诉我如何在组件之间共享数据吗?

    2 回复  |  直到 6 年前
        1
  •  0
  •   Chellappan வ    6 年前

    创建服务

    import { Injectable } from '@angular/core';
    import { Observable } from 'rxjs/Observable';
    import { BehaviorSubject } from 'rxjs/BehaviorSubject';
    import 'rxjs/add/observable/of';
    import 'rxjs/add/observable/from';
    
    @Injectable()
    export class MyService {
    
      thingTwoStream = new Subject();
      ApiKey = new BehaviorSubject<string>(null);
    
    }
    

    然后在登录组件中使用next方法共享值

    import { Component, OnInit, Injectable } from '@angular/core';
    import { User } from '../domain/User';
    import { HttpClient, HttpHeaders } from '@angular/common/http';
    import { LoginResponse } from '../domain/LoginResponse'
    import { MyService} from './myservice';
    @Component({
      selector: 'app-login',
      templateUrl: './login.component.html',
      styleUrls: ['./login.component.css']
    })
    @Injectable()
    export class LoginComponent implements OnInit {
    
      private user:User = new User();
    
      private xSSOFamilyId:string = 'BOMO';
    
      private apiKey:string;
    
      constructor(private httpClient: HttpClient,private service:MyService) { }
    
      ngOnInit() {
      }
    
      login(): void {
    
        var authorization:string = 'Basic ' + btoa(this.user.cwopa + ":" + this.user.password);
        var httpHeaders = new HttpHeaders({
          'Authorization': authorization,
          'userId': this.user.cwopa,
          'X-SSO-Family-Id': this.xSSOFamilyId
        });
        this.httpClient.post<LoginResponse>('http://localhost:8081/web-beginner/authenticate', undefined, {headers: httpHeaders}).subscribe(response => {
          this.apiKey = response.apiKey;
          console.log(this.apiKey)
          window.location.href = "dashboard";
        }, error => {
          console.log("error occured");
        });
      }
    
      public getApiKey(): string {
        this.service.ApiKey.next(this.apiKey);
        return this.apiKey;
      }
    }
    

    然后在仪表板组件中订阅

    import { Component, OnInit } from '@angular/core';    
    import {LoginComponent} from "../login/login.component"
    import { MyService} from './myservice';
    
    @Component({
      selector: 'app-dashboard',
      templateUrl: './dashboard.component.html',
      styleUrls: ['./dashboard.component.css'],
      providers: [LoginComponent]
    })
    export class DashboardComponent implements OnInit {
    
      constructor(public loginComponent: LoginComponent,private service:MyService) { }
    
      ngOnInit() {
         this.service.ApiKey.subscribe((data)=>console.log(data))
      }
    
      authorize(appName:string): void {
        console.log(this.loginComponent.getApiKey())
      }
    }
    
        2
  •  0
  •   Jihoon Kwon    6 年前

    此外,如果需要根据登录信息实现路由路径。 你可以用auth-guard控制它们( https://angular.io/guide/router )