【问题标题】:Share data using EventEmitter Angular 2使用 EventEmitter Angular 2 共享数据
【发布时间】:2018-11-02 00:17:31
【问题描述】:

我的 Angular 2 项目中有 2 个组件。 第一个组件是:

import { Component, OnInit, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'second-component',
  template: '<div><div>'
})

export class SecondComponent implements OnInit{

@Output() changeDetect = new EventEmitter<Boolean>();

private value: boolean;

ngOnInit() {
  this.value = false;
  this.doSomething();
}

doSomething(): void {
  if (2 > 1) {
    this.value = true;
  }
}

changeDetection() {
  this.changeDetect.emit(this.value);
}

}

我需要做的是,我需要在第二个组件中发送this.value 值。 例如方法doSomething() 做了一些改变this.value,它可能是真或假,不管。
第二部分:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'first-component',
  template: '
  <div>FIRST COMPONENT<div>
  <second-component (changeDetect)="changes($event)"></second-component> 
  <span>{{_message}} 
  </span>'
})

export class FirstComponent implements OnInit {

private _change: boolean;
private _message: string;

ngOnInit() {

}

changes(event) {
  // Here i want to get boolean value from the first component to do something like below
  if (event === true) {
    message = 'true';
  }
}

}

我知道我的问题很菜,但我希望你明白我的意思。
任何建议我都会很高兴,因为我完全迷失了。

【问题讨论】:

  • 你是说事件没有发送到子组件中?
  • 目前发生了什么?发出的值不是布尔值吗?
  • 一般情况下,使用 console.log 或浏览器中的调试工具来帮助诊断任何 typescript/javascript 问题。
  • 小心命名 changeDetection 之类的东西,因为 Angular 2+ 允许您注入 changeDetectorRef,这很可能会让您或其他人感到困惑,这使您可以控制更改检测。这与通过EventEmitter 发出事件非常不同。

标签: angular typescript


【解决方案1】:

在这种情况下,您需要手动发出值

doSomething(): void {
  if (2 > 1) {
    this.value = true;
    this.changeDetection();
  }
}

【讨论】:

  • 实际上帮助了我,但我为什么要在这个方法中发出值?如果这种方法在外面,为什么它不起作用?这让我有点困惑
  • 角度变化检测并不是像您期望的那样自动工作。您的功能“changedetection”只是一个功能。我建议您先阅读medium.com/@bencabanes/…,以了解变更检测以及如何使其发挥作用。
【解决方案2】:

我认为问题在于您没有访问您发出的值的属性。

changes(event) {
  // Here i want to get boolean value from the first component to do something like below
  if (event.value === true) {
    message = 'true';
  }
}

当你这样做时:

if (event === true)

同理:

if (event) {

您正在检查它是否为空/未定义。

正如 Alexander 所建议的,你必须接线:

changeDetection() {
  this.changeDetect.emit(this.value);
} 

如果您还没有的话,发送到前端/角度代码上的事件处理程序。

希望对您有所帮助。

【讨论】:

  • 这对我帮助很大,感谢您的回复,但我仍然不明白为什么要将 changeDetection() 方法放在 doSomething() 方法中,为什么如果它在外面就不会发出
  • 但我不明白,您的 changeDetection() 函数已连接到前端的事件处理程序,对吧?您也可以发布您的 HTML 吗?
猜你喜欢
  • 1970-01-01
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2017-11-06
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多