【发布时间】:2016-05-20 05:48:45
【问题描述】:
我正在使用 Angular 2 来制定指令。我将以下事件绑定到主机组件:
host: {
'(mouseenter)': 'onMouseEnter($event)',
'(mouseleave)': 'onMouseLeave($event)'
}
我还在指令上创建了两个流和侦听器来管理这两个事件
export class PopupDirective {
private _mouseEnterStream: EventEmitter<any> = new EventEmitter();
private _mouseLeaveStream: EventEmitter<any> = new EventEmitter();
onMouseEnter($event) {
this._mouseEnterStream.emit($event);
}
onMouseLeave($event) {
this._mouseLeaveStream.emit($event);
}
}
我希望我的subscribe 仅在mouseenter 事件在固定延迟后仍处于活动状态时才被调用(即mouseleave 尚未发生)。我试过这样做,但它不起作用(这是有道理的,我只是不知道如何解决它)。
this._mouseEnterStream.flatMap((e) => {
return Observable
.of(e)
.takeUntil(this._mouseLeaveStream);
}).delay(2000).subscribe(
() => console.log('yay, it worked!')
);
有 Angular 2 / RxJS 经验的人知道我应该如何处理这个问题吗?
【问题讨论】:
-
this._mouseStream来自哪里? -
@GünterZöchbauer 抱歉,应该是 mouseEnterStream
-
顺便说一句,因为你使用的是 Rx,所以你真的不需要 EventEmitters。只需使用主题即可。有点惊讶您可以将 EventEmitters 用作 Observables,也许 ng2 会在后台转换它们。
-
@kakigoori EventEmitters 是 Observables的重点不是吗?不过感谢您的提示。
-
通常要在其他项目中将 EventEmitters 用于 Observables,您必须使用静态
fromEvent方法从事件发射器生成一个 observable。我曾经是事件发射器的重度用户,但是冷/热流、操作符和整个创建/订阅/处置都太好了。 (你可能会发现 Andre 的帖子很有用:stackoverflow.com/questions/25338930/…)