【发布时间】:2016-04-27 20:50:11
【问题描述】:
在我的应用程序中,我有一些组件通过EventService 进行通信。
@Injectable()
export class EventService {
public myEvent: EventEmitter<any> = new EventEmitter();
constructor() {}
}
此服务被注入到EmitterComponent 中,当单击按钮时会发出事件
@Component({
selector: 'emitter',
template: `<button (click)="onClick()">Click me</button>`,
})
export class EmitterComponent {
constructor(private eventService:EventService) {}
onClick() {
this.eventService.myEvent.emit();
}
}
在订阅事件的ReceiverComponent 中,接收到的每个事件都会增加一个计数器
@Component({
selector: 'receiver',
template: `Count: {{count}}`,
})
export class ReceiverComponent {
public count = 0;
constructor(private eventService:EventService) {
this.eventService.myEvent.subscribe(() => this.count++;);
}
}
应用程序有多个视图(在此示例中只有两个):PageA 和 PageB。 EmitterComponent 和 ReceiverComponent 在 PageA 中。每次去PageB,再回到PageA,都会创建一个新的ReceiverComponent,当我点击EmitterComponent中的按钮时,会多次执行ReceiverComponent的事件回调函数。
为了避免这种情况,我在ngOnDestroy 中从myEvent 取消订阅ReceiverComponent
ngOnDestroy() {
this.eventService.myEvent.unsubscribe();
}
但这会导致以下异常
EXCEPTION: Error during instantiation of ReceiverComponent!.
ORIGINAL EXCEPTION: Error: Cannot subscribe to a disposed Subject
我怎样才能避免这种情况?如何正确退订?
为了更好地理解,我创建了这个plunker,您可以在控制台中看到错误和一些 cmets。
【问题讨论】:
标签: angular eventemitter