【问题标题】:ngIf- Expression has changed after it was checked. Previous value: 'ngIf: false'. Current value: 'ngIf: true'ngIf- 表达式在检查后发生了变化。以前的值:'ngIf: false'。当前值:'ngIf: true'
【发布时间】:2019-02-03 19:03:22
【问题描述】:

当一个组件没有父子关系时,如何调用另一个组件的方法?

我有 2 个兄弟组件,如下所示:

header.ts

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

part.ts

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

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

【问题讨论】:

标签: angular typescript angular5


【解决方案1】:

我的解决方案是使用

    ngAfterViewChecked(){
      this.cdRef.detectChanges();
    }

在您收到错误的组件中

【讨论】:

    【解决方案2】:

    与非父子组件通信。所以我是通过服务来沟通的

    service.ts

    value=false; 
    search: EventEmitter < boolean > = new EventEmitter();
    toggle() {
       this.value = !this.value;
       this.search.emit(this.value);
    }
    

    搜索.ts

    submit():void{
      this.service.toggle();
    }
    

    首页.ts

    ngOnInit() {    
       this.service.change.subscribe(value => {
               //some code here
        }
    }
    

    【讨论】:

      【解决方案3】:

      不能直接触发同级组件的方法,但是有办法使用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.
      
           })
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-31
        • 1970-01-01
        • 2020-06-18
        • 2019-01-05
        • 1970-01-01
        • 2017-09-16
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        相关资源
        最近更新 更多