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

Posted

技术标签:

【中文标题】我应该如何将数据从我的服务传递到小吃店组件?【英文标题】:How should I pass data from my service to snack bar component? 【发布时间】:2019-02-15 04:40:06 【问题描述】:

我有一个这样创建的快餐栏组件!

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);
      );
  


【问题讨论】:

谁能帮我解决这个问题!!所以渴望有它的解决方案! createUser() 方法何时调用? 它是从另一个创建用户的组件调用的,然后我想通过snackbar将注册信息发送给用户! 你需要注入 HttpClient: constructor(private http: HttpClient) 对不起,Dirk,我已经删除了构造函数,因此重点只放在我为小吃店编写的代码上。关键在于,除了组件中的可观察调用之外,一切都在工作。侦听器上的 .next 方法在身份验证服务中被调用,但在快餐栏组件上没有得到任何调用或更新。 【参考方案1】:

尝试使用new BehaviorSubject&lt;object&gt;(null); 作为mesageListener。

您可以在此处查看有关 Subject 和 BehavoiurSubject 的更多详细信息:angular2-difference-between-a-behavior-subject-and-an-observable/

在组件中订阅 Observable 的值。它应该可以工作。

【讨论】:

以上是关于我应该如何将数据从我的服务传递到小吃店组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将默认的小吃店动画更改为“从顶部到按钮”?

将 MudBlazor 小吃店选项 Action<SnackbarOptions> 作为函数参数传递

如何创建一个出现在所有屏幕上的小吃店?

Flutter Redux 小吃店

如何在不重叠的情况下显示多个小吃店

如何在服务上使用 SnackBar 以在 Angular 2 中的每个组件中使用