关于 Angular 2 中的事件发出的一些疑问。这个例子究竟是如何工作的?

Posted

技术标签:

【中文标题】关于 Angular 2 中的事件发出的一些疑问。这个例子究竟是如何工作的?【英文标题】:Some doubts about the event emit in Angular 2. How exactly this example works? 【发布时间】:2017-11-20 08:13:31 【问题描述】:

我是 Angular 2 的绝对初学者,我对这个与框架如何发出事件有关的示例的工作原理有一些疑问(我正在学习教程)。

所以我有以下情况:

主要组件是 app-root 并包含此视图:

<div class="container">
  <div class="row">
    <div class="col-xs-12">
      <app-game-control></app-game-control>
    </div>
  </div>
</div>

如您所见,包括&lt;app-game-control&gt;&lt;/app-game-control&gt; 子组件。它的视图仅在我的单页应用程序中显示 2 个按钮,这些按钮:

<button
  class="btn btn-success"
  (click)="onStartGame()"
>Start Game</button>

<button class="btn btn-danger">Pause Game</button>

点击第一个调用相关的子组件控制器方法onStartGame(),这是该控制器的全部代码:

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

@Component(
  selector: 'app-game-control',
  templateUrl: './game-control.component.html',
  styleUrls: ['./game-control.component.css']
)
export class GameControlComponent implements OnInit 

  intervalFired = new EventEmitter<number>();
  interval;
  lastNumber = 0;


  constructor()  

  ngOnInit() 
  

  onStartGame() 
    this.interval = setInterval(() => 
      this.intervalFired.emit(this.lastNumber + 1);
      this.lastNumber ++;
    , 10000);
  


在这里,我对单击按钮时究竟发生了什么有一些疑问。

据我了解,事件只是一个可以发出的对象,在这种情况下,它应该是一个包含单个数字字段的对象:

intervalFired = new EventEmitter<number>();

这是对事件的解释正确还是我遗漏了什么?

当用户点击按钮时,onStartGame() 被执行。此方法应发出事件(对其值进行简单计算)。

但是发出事件究竟是什么意思呢?谁是这个发出事件的接收者?我认为它应该是父组件控制器,但我绝对不确定。

具体是如何工作的?

【问题讨论】:

你应该阅读文档:angular.io/guide/… 在您当前的示例中,nothing 正在接收事件;您没有将其绑定在父模板中。 【参考方案1】:

当组件具有 EventEmitter 作为其属性之一时,它开始向使用它的组件发出事件。这与您使用的button 元素基本相同。让我们想象button 是一个组件。它会这样声明:

@Component(
    selector: 'button',
    template: '<div (click)="onButtonClick()"></div>'
)
class Button 
    click = new EventEmitter();

    onButtonClick() 
        this.click.emit(/* an event value */)
    

然后你通过监听click事件(&lt;button (click)="onStartGame()"&gt;)在你的GameControlComponent中使用这个button组件。

您现在大概可以了解发出了什么以及接收者应该是谁。在您的示例中,GameControlComponentintervalFired 事件的使用者应该是您的AppRoot 组件,或使用&lt;app-game-control&gt; 组件的任何其他组件。

<div class="container">
  <div class="row">
    <div class="col-xs-12">
      <app-game-control (intervalFired)="handleInterval($event)"></app-game-control>
    </div>
  </div>
</div>

如您所见,handleInterval 函数具有 $event 参数。此参数的值是您的内部 (GameControlComponent) 组件发出的值,即。 this.lastNumber + 1.

【讨论】:

【参考方案2】:

您应该使用@Output() 从组件发出事件。

注意:@Output() intervalFired = new EventEmitter&lt;number&gt;(); 应该是要发出的事件。

您可以在根组件中处理该事件,如下所示,

<div class="col-xs-12">
      <app-game-control (intervalFired)="intervalFired($event)" ></app-game-control>
</div>

打字稿代码

intervalFired(e)
   this.lastNumber = e;
  console.log(e)

LIVE DEMO

【讨论】:

以上是关于关于 Angular 2 中的事件发出的一些疑问。这个例子究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

SVG:关于事件的对象分层

Angular - 从父组件向动态子组件发出事件

Angular MatSort.sortChange:尝试从函数更新排序时忽略事件数据

节点 js busboy 不使用 angular js $http post 发出事件

Angular 材料 2:如何区分一个组件中的 2 个或多个可排序表?

有关Angular 2.0的一切