在没有父子关系的情况下如何从一个组件调用方法
我有2个同级组件,如下所示...
header.ts
private postValues() {
this._PartService.PostDataValues(this.search)
.subscribe(result => {
})
}
part.ts
this._PartService.getMasterData()
.subscribe(result => {
})
在这种情况下,我需要将postValues()方法调用到getMasterData()中以获取一些描述值,并且它没有父级和子级通信
答案 0 :(得分:2)
不可能直接触发同级组件方法,但是有一种方法可以使用 import { BehaviorSubject } from 'rxjs';
我使用这种方法将数据传递给同级组件,但是如果您触发事件,它也可以正常工作。
首先创建服务,我称其为服务 DataService.ts
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Injectable()
export class DataService {
private triggerEventMsg = new BehaviorSubject(false);
triggerEvent = this.triggerEventMsg.asObservable();
constructor() { }
triggerEvent(val: boolean) {
this.messageSource.next(message)
}
}
现在一个组件触发另一个组件,现在,Com1触发Com2事件。
具有传递布尔值的Com1触发器DataService triggerEvent。
Com1.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";
@Component({
selector: 'app-com1',
template: `
{{message}}
<button (click)="newMessage()">New Message</button>
`
})
export class Com1 implements OnInit {
constructor(private data: DataService) { }
ngOnInit() {
}
com1ClickEvent() {
this.data.triggerEvent(true);
}
}
Com2当数据更改Com2组件中的方法触发器时,请观察该变量。
Com2.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";
@Component({
selector: 'app-com2',
template: `
<p>Com2</p>
`
})
export class Com2 implements OnInit {
constructor(private data: DataService) { }
ngOnInit() {
this.data.triggerEventMsg.subscribe(message => {
// Do What ever you want.
})
}
}
答案 1 :(得分:1)
我的解决方法是使用
ngAfterViewChecked(){
this.cdRef.detectChanges();
}
出现错误的组件中
答案 2 :(得分:0)
父组件内部的强制更改检测周期
检测更改
检查此视图及其子级。与分离结合使用 实施本地变更检测检查
import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
constructor(private cd: ChangeDetectorRef) {
}
ngAfterViewInit() {
this.cd.detectChanges();
}
答案 3 :(得分:0)
与非父子组件通信。所以我正在通过服务进行沟通
service.ts
value=false;
search: EventEmitter < boolean > = new EventEmitter();
toggle() {
this.value = !this.value;
this.search.emit(this.value);
}
search.ts
submit():void{
this.service.toggle();
}
Home.ts
ngOnInit() {
this.service.change.subscribe(value => {
//some code here
}
}
答案 4 :(得分:0)
另一种选择是在以下之间添加api调用
setTimeout(()=> {
// api调用在这里
},1000);