【问题标题】:Cross-Component communication on a Single Page Application in Angular 8Angular 8 中单页应用程序上的跨组件通信
【发布时间】:2019-11-12 17:07:06
【问题描述】:

我正在开发一个单页应用程序,前端使用 Angular 8,后端使用 Laravel。从登录表单捕获数据后,通过 JWT 提交到后端,效果很好。后来我得到了回应 在来自后端的表单(login.component.ts)的逻辑文件上。

现在我试图通过名为 AuthCheck 的共享服务将来自登录组件的响应传递给另一个组件。最后,我将数据传递给导航栏组件文件并最终将其显示在视图上。基本上是跨组件通信。

在服务中,我使用 rxjs 来监听响应并设置一个 observable。接下来我尝试将我的数据分配给服务中的一个变量,我在导航栏组件逻辑文件中监听并显示在导航栏视图上。

问题是我不断收到登录组件抛出的 ERROR TypeError: "this.AuthCheck.checkUser is not a function" 错误

~请帮忙?

Login.component.ts

import { Component, OnInit } from '@angular/core';
import { AuthService } from 'src/app/Services/auth.service';
import { TokenService } from 'src/app/Services/token.service';
import { Router } from '@angular/router';
import { AuthCheckService } from 'src/app/Services/auth-check.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {

  public form = {
    email: null,
    password: null
  };

  public error = null;

  constructor(
    private Auth:AuthService,
    private Token:TokenService,
    private router: Router,
    private AuthCheck : AuthCheckService
  ) { }

  //Submit the form data to the backend
  onSubmit(){
    this.Auth.login(this.form).subscribe(
      data => this.handleResponse(data),
      error => this.handleError(error)
    );
  }

  //Function to listen to the response
  handleResponse(data){
    //Pass the data to checkUser method in AuthCheckService
    this.AuthCheck.checkUser(data.user);
  }

  //Handles any errors
  handleError(error){
      this.error = error.error.error;
  }

  ngOnInit() {
  }

}

身份验证服务

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

@Injectable({
  providedIn: 'root'
})
export class AuthCheckService {

private userName = null;

    private userName = new BehaviorSubject<string>(this.checkUser());
    checkUser$ = this.userName.asObservable();

    checkUser(data: any){
        this.user = data;
        this.userName.next(this.user);
    }

    constructor() { }
}

导航栏组件 ts 文件

import { Component, OnInit } from '@angular/core';
import { AuthCheckService } from 'src/app/Services/auth-check.service';

@Component({
  selector: 'app-navbar',
  templateUrl: './navbar.component.html',
  styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {

  public userName : string;

  constructor(
    private AuthCheck : AuthCheckService
  ) { }

  ngOnInit() {
      this.AuthCheck.checkUser$.subscribe(message => this.userName = message);
  }
}

导航栏组件(标记文件)

<a class="navbar-brand" *ngIf="loggedIn">Welcome {{ userName }}</a>

【问题讨论】:

  • 您是否尝试过将 AutCheck 服务中的 checkUser 方法重命名为不同的名称。您的问题可能是由该服务中具有相同名称的属性引起的。

标签: angular components single-page-application communication


【解决方案1】:

您创建了一个同名的属性和方法(checkUser),将其更改如下:

checkUser 更改为checkUser$。您还应该将BehaviorSubject 设置为userName。请取消注释该行

身份验证服务

//private userName = null;

//Check logged in userName
private userName = new BehaviorSubject<string>('Martin');
checkUser$ = this.userName.asObservable();


checkUser(data: any){
    this.user = data;
    this.userName.next(this.user);
}

在您的导航栏组件中

ngOnInit() {
   this.AuthCheck.checkUser$.subscribe(message => this.userName = message);
}

【讨论】:

  • 我已在我的 AuthCheck 服务中添加了您的第一个代码块,但出现此错误:
  • 分享我的错误。希望您也使用checkUser$ 更新您的导航栏组件
  • 页面加载时出现此错误:ERROR TypeError: "this.userName is null",我还按照您的建议编辑了代码 sn-p,请查看..
  • 您应该将这一行 this.userName.next(message); 更改为 this.userName.next(this.user)。或分享您在this.user 属性中收到的数据。我也更新了答案
  • @Belhi,非常感谢或帮助和耐心..我已经想通了
猜你喜欢
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2016-06-12
相关资源
最近更新 更多