如何将数据从服务传递到小吃店组件?

时间:2018-09-10 17:47:07

标签: angular-material angular6 angular2-services subject snackbar

我有一个像这样创建的小吃店组件!

import {Component, ViewEncapsulation, OnInit, OnDestroy} from '@angular/core';
import {
  MatSnackBar,
  MatSnackBarConfig,
  MatSnackBarHorizontalPosition,
  MatSnackBarVerticalPosition,
} from '@angular/material';
import { Subscription } from 'rxjs';


import { AuthenticationService } from "../../services/authentication.service";


@Component({
  selector: 'snack-message',
  templateUrl: './messages.component.html',
  styleUrls: [ './mesaages.component.scss' ],
  encapsulation: ViewEncapsulation.None
})

export class SnackBarMessages implements OnInit, OnDestroy {
  action: boolean = true;
  setAutoHide: boolean = true;
  autoHide: number = 2000;
  horizontalPosition: MatSnackBarHorizontalPosition = 'center';
  verticalPosition: MatSnackBarVerticalPosition = 'bottom';
  private showMessageSub: Subscription;
  messageData: object;

  addExtraClass: boolean = false;

constructor(public snackBar: MatSnackBar, public authenticationService: AuthenticationService) {

}

ngOnInit() {
  this.messageData = this.authenticationService.getMessageData();
  this.showMessageSub = this.authenticationService.getMessageListener()
      .subscribe(data => {
          this.messageData = data;
      });
   this.openMessageSnackBar(this.messageData);
}

 openMessageSnackBar(data) {
  let config = new MatSnackBarConfig();
  config.verticalPosition = this.verticalPosition;
  config.horizontalPosition = this.horizontalPosition;
  config.duration = this.setAutoHide ? this.autoHide : 0;
  this.snackBar.open(data.message, data.action, config);
 }

 ngOnDestroy() {
   if (this.showMessageSub) {
     this.showMessageSub.unsubscribe();
   }
 }
}
  

我添加了主题,并且创建了一个订阅,该订阅在我的身份验证服务中侦听messageListener。然后,我用我的subjectListener调用下一个要传递的数据。我没有接到任何电话。我不明白为什么?这是我的服务!

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Subject } from 'rxjs';
import { Router, ActivatedRoute } from '../../../node_modules/@angular/router';
@Injectable({
  providedIn: 'root'
})

export class AuthenticationService {
  private mesageListener = new Subject<object>();
  private messageData: object;

getMessageListener() {
    return this.mesageListener.asObservable();
  }

getMessageData() {
    return this.messageData;
  }


createUser(email: string, password: string) {
    const userData: AuthModel = { 
      email: email,
      password: password
    }
    const requestPath = this.getModes()[`${this.navigatedFrom}`];
    this.http.post(`http://localhost:3000/api/${requestPath}/signup`,userData)
      .subscribe(response => {
        this.messageData = {
          message: 'Sign Up Successful. Please Login now!',
          action: 'Ok! Got it.'
        }
        this.mesageListener.next(this.messageData);
      });
  }

}

1 个答案:

答案 0 :(得分:0)

尝试将new BehaviorSubject<object>(null);用于mesageListener。

您可以在angular2-difference-between-a-behavior-subject-and-an-observable/

上查看有关Subject和BehavoiurSubject的更多详细信息。

在Component中订阅Observable的值。应该可以。