使用服务不起作用的 2 个组件之间的交互 ​​Angular 6/7

Posted

技术标签:

【中文标题】使用服务不起作用的 2 个组件之间的交互 ​​Angular 6/7【英文标题】:Interaction between 2 components angular 6/7 using service not working 【发布时间】:2019-07-14 12:56:44 【问题描述】:

您好,我是 Angular 新手并开始学习。 问:我有 2 个组件,一个是从角材料中选择下拉列表,另一个组件是从角材料中选择表格。所以当我从下拉列表中进行选择时,我想在表格组件中看到该选定值。这是我的代码。不知何故,当我当时进行选择时,服务正在调用该方法并进行侦听,但之后我期望执行另一种方法来订阅以侦听更改。 (抱歉,如果我没有使用正确的术语)

以下是组件的结构。

navbarparent.component.html (These are 2 main components)
<div>
   <app-mr-navbar> <!-- navbar.component.html --> </app-mr-navbar>
   <app-player-overview> <!-- Tablecomponent.html --> </app-player-overview>
</div>

选择组件是组件的子组件。有下拉菜单。

navbar.component.html

<div class="nav-header ">
<mat-grid-list cols="7">
<div>
  <mat-grid-tile>
    <app-eyefilter-navbar> <!--  selectbox.component.html --> </app-eyefilter-navbar>
  </mat-grid-tile>
</div>
</mat-grid-list>
</div>

这是 selectbox.component.html

<div class="eyefilter-dd inline-style eachSelect">
<mat-form-field>
<mat-select (selectionChange)="selectionChange($event.value)" placeholder="EyeFilter" [formControl]="eyefilters" multiple id="eyeFilter">
  <mat-option  *ngFor="let filter of filterList" [value]="filter" class="custom-font-size">filter</mat-option>
</mat-select>
</mat-form-field>
</div>

这是我的常用服务文件。

commonservice.ts

import Injectable from '@angular/core';
import HttpClient from '@angular/common/http';
import  Observable from 'rxjs/index';
import  BehaviorSubject, Subject from 'rxjs/index';


@Injectable()
export class PlayerSkillsService 
 private subject = new Subject<any>();
 onChangeSelect(val: string) 
 this.subject.next(val);
 

 getSelectedDropdown(): Observable<any> 
  return this.subject.asObservable();
 

这是选择框组件 ts 文件。

selectbox.component.ts

import PlayersService from '../../services/playerskills.service';
@Component(
 selector: 'app-eyefilter-navbar',
 templateUrl: './eyefilter.component.html',
 styleUrls: ['eyefilter.component.scss'],
 encapsulation: ViewEncapsulation.None
)


export class EyefilterComponent 
eyefilters = new FormControl();
filterList: string[] = ['Height', 'age', 'Show Power' , 'Finishing', 'Agility'];

constructor(private playerservice: PlayerSkillsService) 
selectionChange(selectedVal): void  // This is executing
this.playerservice.onChangeSelect(selectedVal[0]);


这是表格组件的ts文件。

import Component, OnInit, ViewChild, ViewEncapsulation, Input, OnChanges, SimpleChanges from '@angular/core';
import Subscription from 'rxjs/index';
import PlayerSkillsService from '../../services/playerskills.service';

export class PlayersDataComponent implements OnInit 
  selectedDropdownVal: any;
  subcription: Subscription;
  constructor(private playerservice: PlayerSkillsService) 
   this.subcription = this.playerservice.getSelectedDropdown().subscribe(selectedDropdownVal => this.selectedDropdownVal = selectedDropdownVal);
   // expecting selectedDropdownVal value to be set when you change the selection from selectbox. 
   // THIS IS NOT WORKING.
  
  ngOnInit() 
    this.subcription = this.playerservice.getSelectedDropdown().subscribe(selectedDropdownVal => this.selectedDropdownVal = selectedDropdownVal);
  

我不确定我在这里缺少什么。有人可以帮忙吗?如果需要更多信息,请告诉我。谢谢

【问题讨论】:

在您的表格组件中,将订阅放在 ngOnInit 下,这样可以确保订阅时服务已准备就绪 @Eliseo :我已经编辑了您建议的内容,但仍然无法正常工作。我的意思是在选择下拉更改值后不会进入表格组件。 伙伴你检查进口了吗?我认为 Subject 应该像这样导入 --> import Subject from 'rxjs/Subject'; 【参考方案1】:

您必须在拥有下拉菜单的组件中使用 EventEmitter:https://angular.io/api/core/EventEmitter

然后在另一个组件上你必须捕获 $event。这是一个完整的例子:https://www.infragistics.com/community/blogs/b/infragistics/posts/understanding-output-and-eventemitter-in-angular

【讨论】:

【参考方案2】:

感谢@Ionut Tepus。它有助于。我错过了这个单行函数来捕获 playertable 组件中选定的下拉值。

this.data.currentMessage.subscribe(message => 
  this.message = message;
  this.filterBasedonSelection();
  console.log('message', message);
);

【讨论】:

以上是关于使用服务不起作用的 2 个组件之间的交互 ​​Angular 6/7的主要内容,如果未能解决你的问题,请参考以下文章

使用服务在角度组件之间调用方法不起作用

Angular 6:在功能模块之间共享组件不起作用

与在另一个窗口中打开的组件交互

在组件之间切换时,ng-deep 不起作用?

reactjs 中的组件之间的转换不起作用并且没有应用 css 属性

在 service.subscribe 中组件的构造函数中的 Angular 更新不起作用