Tiz*_*noL 24 eventemitter angular
在我的应用程序中,我有一些通过的方式进行通信的组件 EventService
.
@Injectable()
export class EventService {
public myEvent: EventEmitter<any> = new EventEmitter();
constructor() {}
}
Run Code Online (Sandbox Code Playgroud)
EmitterComponent
当单击按钮时,此服务将注入一个发出事件的服务
@Component({
selector: 'emitter',
template: `<button (click)="onClick()">Click me</button>`,
})
export class EmitterComponent {
constructor(private eventService:EventService) {}
onClick() {
this.eventService.myEvent.emit();
}
}
Run Code Online (Sandbox Code Playgroud)
并且在ReceiverComponent
订阅事件中并且对于每个收到的事件增加一个计数器
@Component({
selector: 'receiver',
template: `Count: {{count}}`,
})
export class ReceiverComponent {
public count = 0;
constructor(private eventService:EventService) {
this.eventService.myEvent.subscribe(() => this.count++;);
}
}
Run Code Online (Sandbox Code Playgroud)
该应用程序有多个视图(在这个例子中只有两个):PageA
和PageB
.EmitterComponent
并且ReceiverComponent
在PageA
.每次进入PageB
并返回时PageA
,ReceiverComponent
都会创建一个new ,当我单击该按钮时EmitterComponent
,ReceiverComponent
会执行多次事件回调函数.
为了避免这种情况我退订ReceiverComponent
来自myEvent
于ngOnDestroy
ngOnDestroy() {
this.eventService.myEvent.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)
但这会导致以下异常
EXCEPTION: Error during instantiation of ReceiverComponent!.
ORIGINAL EXCEPTION: Error: Cannot subscribe to a disposed Subject
Run Code Online (Sandbox Code Playgroud)
我怎么能避免这种情况?如何正确取消订阅?
为了更好地理解,我创建了这个plunker,您可以在控制台中看到错误和一些注释.
Gün*_*uer 33
你从中获得订阅.subscribe()
.使用其unsubscribe()
方法取消订阅.
@Component({
selector: 'receiver',
template: `Count: {{count}}`,
})
export class ReceiverComponent {
public count = 0;
private subscription;
constructor(private eventService:EventService) {
this.subscription = this.eventService.myEvent.subscribe(() => this.count++;);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Run Code Online (Sandbox Code Playgroud)
也可以看看
归档时间: |
|
查看次数: |
22652 次 |
最近记录: |