【问题标题】:How do i send data from component A to component B Angular 2我如何将数据从组件 A 发送到组件 B Angular 2
【发布时间】:2018-01-16 16:07:54
【问题描述】:

我想在我的 NavbarComponent 上显示用户名,数据来自 LoginComponent。

login.component.ts

import { Component, OnInit } from '@angular/core';
import { FormBuilder,FormGroup,Validators,FormControl } from '@angular/forms';
import { AuthService } from '../../services/auth.service';
import { Router } from '@angular/router';
import { FlashMessagesService } from 'angular2-flash-messages';


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


  form : FormGroup;
  message;
  messageClass;

  constructor(
    private formBuilder: FormBuilder,
    private authService:AuthService,
    private router: Router,
    private flashMessagesService:FlashMessagesService
    ) { 
    this.createForm();
  }


  createForm(){
    this.form=this.formBuilder.group({
      username:['', Validators.required],
      password:['', Validators.required]
    })
  }

  onLoginSubmit(){

    const user={
      username: this.form.get('username').value,
      password: this.form.get('password').value
    }

    this.authService.login(user).subscribe(data=>{
      if(!data.success){
        this.messageClass="alert alert-danger";
        this.message=data.message;
      }
      else{
        this.messageClass="alert alert-success";
        this.message=data.message;
        this.authService.storeUserData(data.token,data.user);
        setTimeout(()=>{
          this.router.navigate(['/profile']);
        },2000);

        this.flashMessagesService.show('Welcome to bloggy, '+ this.form.get('username').value +' !',{cssClass: 'alert-info'});

      }
    });
  }

}

navbar.component.ts

import { Component, OnInit } from '@angular/core';
import { AuthService } from '../../services/auth.service';
import { Router } from '@angular/router';
import { FlashMessagesService } from 'angular2-flash-messages';


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


  usernameNav;

  constructor(
    private authService:AuthService,
    private router:Router,
    private flashMessagesService:FlashMessagesService
    ) { }  



  onLogoutClick(){
    this.authService.logout();
    this.flashMessagesService.show('You are logged out',{cssClass: 'alert-info'});
    this.router.navigate(['/']);
  }


  ngOnInit() {

  }

}

如果代码太多,我很抱歉,但基本上我想在 onLoginSubmit() 函数中从 LoginComponent 获取 data.user.username,将其发送到 NavbarComponent,在变量中使用它并在 html 上显示它。 我尝试导入 NavbarComponent,没有成功。

【问题讨论】:

  • 你应该看看这个:angular.io/guide/component-interaction 特别是最后一个,你可能正在寻找服务通信。
  • 嘿,谢谢您的回答,您可能都是对的,但在我看来,仅为一个目的创建服务有点奇怪。一定有更简单的方法!无论如何,我现在会检查一下
  • 这两个组件之间是否存在子父关系?

标签: javascript angular components frontend


【解决方案1】:

非常有趣的问题,基本上你的问题的解决方案是Observable/subscriber,你需要 当登录组件中的值发生变化时监听并发送回导航栏组件显示。

你可以像这样使用全局 Observable

假设您像这样在全局文件中创建一个 Observable

public loggedInObs: Rx.Subject<any> = new Rx.Subject<any>();
public loggedInVar: boolean = false;

为了使用它,你必须导入一些像这样的依赖项

import { Observable } from 'rxjs/Rx';
import * as Rx from 'rxjs/Rx';
import 'rxjs/add/observable/of';
import 'rxjs/Rx';
import 'rxjs/add/operator/map';

在您的登录组件中,您告诉 Angular 发生了一些更改,例如用户登录成功。 并触发 observable ,以便 angular 能够在您设置 subscriber 的整个应用程序中收听该用户 已登录应用程序。代码如下

this.authService.login(user).subscribe(data=>{
  if(!data.success){
    this.messageClass="alert alert-danger";
    this.message=data.message;
  }
  else{
    this.messageClass="alert alert-success";
    this.message=data.message;

    localStorage.setItem('user_info', JSON.stringify(data.user))
    /*for Global level observable fire here*/
    this.global_service.loggedInVar = true;         //i assume global_service here as your Global service where we declared variables
    this.global_service.loggedInObs.next(this.global_service.loggedInVar);

    this.authService.storeUserData(data.token,data.user);
    setTimeout(()=>{
      this.router.navigate(['/profile']);
    },2000);

    this.flashMessagesService.show('Welcome to bloggy, '+ this.form.get('username').value +' !',{cssClass: 'alert-info'});

  }

现在您可以在导航栏组件中使用订阅者在应用程序的任何位置收听此内容

userdata = JSON.parse(localStorage.getItem('user_info'));  // in case of normal loading page
this.userName = userdata.user_name

this.global_service.loggedInObs.subscribe(res => {       // in case of when without refresh of page
    console.log('changes here in login');
    userdata = JSON.parse(localStorage.getItem('user_info'));
    this.userName = userdata.user_name
})

如果有任何疑问,请告诉我。

【讨论】:

    猜你喜欢
    • 2018-03-29
    • 2018-07-07
    • 2017-10-19
    • 2021-02-15
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多