ngIf-表达式在检查后已更改。先前的值:'ngIf:false'。当前值:'ngIf:true'

时间:2018-08-29 05:10:43

标签: angular typescript angular5

在没有父子关系的情况下如何从一个组件调用方法

我有2个同级组件,如下所示...

header.ts

private postValues() {
   this._PartService.PostDataValues(this.search)
       .subscribe(result => {
       })
}

part.ts

this._PartService.getMasterData()
    .subscribe(result => {
    })

在这种情况下,我需要将postValues()方法调用到getMasterData()中以获取一些描述值,并且它没有父级和子级通信

5 个答案:

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