Angular2 ngOnDestroy,发出事件

11

在ngOnDestroy上触发自定义事件是否可能?我尝试过,但似乎不起作用... 我基本上需要知道何时从UI中删除指令。

@Output() rowInit = new EventEmitter();
@Output() rowDestroy = new EventEmitter();

ngAfterViewInit() {

    this.rowInit.emit(this);
}

ngOnDestroy() {
    console.log("I get called, but not emit :(, ngAfterViewInit works :)");
    this.rowDestroy.emit(this);
}
1个回答

17

我认为你可以在一个服务中定义一个EventEmitter,而不是在组件内部定义。这样,您的组件就可以利用服务的属性来触发事件。

import {EventEmitter} from 'angular2/core';

export class NotificationService {
  onDestroyEvent: EventEmitter<string> = new EventEmitter();
  constructor() {}
}

export class MyComponent implements OnDestroy {
  constructor(service:NotificationService) {
    this.service = service;
  }

  ngOnDestroy() {
    this.service.onDestroyEvent.emit('component destroyed');
  }
}

其他元素/组件可以订阅此事件发射器以接收通知:

this.service.onDestroyEvent.subscribe(data => { ... });

希望这能对你有所帮助, Thierry


非常感谢您,Thierry!我还有一个问题要问你:我创建了一个带有一些事件发射器的服务,如下所示:tableViewOnInitEvent = new EventEmitter(); 等等。是否可以将这些发射器设置为“仅订阅/只读”?我不想直接通过服务调用发射器,但我想从服务内部的函数调用发射器,像这样:(在服务内部):public tableViewOnInit(tableView) { this.tableViewOnInitEvent.next({ tableView: tableView }); } 谢谢 :) - jona jürgen
服务是一个好的解决方案。如果您需要临时解决方案,可以手动订阅(和取消订阅)。 请参见http://stackoverflow.com/questions/37609758/angular2-component-impossible-to-emit-an-output-eventemitter-inside-ngondestro?lq=1以获取更详细的说明。 - Shlomi Assaf
通知服务是一个全局总线,即使您切换到这种方法,仍然需要一种过滤出您关心的元素的方式,而 EventEmitter 可以将其事件包含在层次结构中。 - Ruan Mendes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接