Angular 2 RxJS 检查鼠标事件在延迟后是否仍然有效
Angular 2 RxJS check if mouse event is still active after delay
我正在使用 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 经验的人知道我应该如何处理这个问题吗?
看起来很像 How do I timeout an event in RxJS?
this.myStream = this._mouseEnterStream
.flatMap((e) => {
return Observable
.of(e)
.delay(2000)
.takeUntil(mouseLeaveStream);
});
myStream.subscribe((x) => {
console.log('onNext: ', x);
});
我自己不使用 TS 或 Rx(仅使用 Dart),因此我不知道这是否是正确的语法,或者运算符的名称是否与 Angular 可用的匹配。
Günter 的回答正是您所期望的,但您应该使用 of
运算符而不是 return
不存在的运算符。
this._mouseEnterStream.flatMap((e) => {
console.log('_mouseEnterStream.flatMap');
return Observable
.of(e)
.delay(2000)
.takeUntil(this._mouseLeaveStream);
}).subscribe(
(e) => {
console.log('yay, it worked!');
console.log(e);
}
);
查看对应的plunkr:https://plnkr.co/edit/vP3xRDXxFanqzLEKd3eo?p=preview.
此外,a proposal in Angular 旨在简化通过模板语法使用 Rx 从 DOM 事件创建可观察对象的方式。
我正在使用 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 经验的人知道我应该如何处理这个问题吗?
看起来很像 How do I timeout an event in RxJS?
this.myStream = this._mouseEnterStream
.flatMap((e) => {
return Observable
.of(e)
.delay(2000)
.takeUntil(mouseLeaveStream);
});
myStream.subscribe((x) => {
console.log('onNext: ', x);
});
我自己不使用 TS 或 Rx(仅使用 Dart),因此我不知道这是否是正确的语法,或者运算符的名称是否与 Angular 可用的匹配。
Günter 的回答正是您所期望的,但您应该使用 of
运算符而不是 return
不存在的运算符。
this._mouseEnterStream.flatMap((e) => {
console.log('_mouseEnterStream.flatMap');
return Observable
.of(e)
.delay(2000)
.takeUntil(this._mouseLeaveStream);
}).subscribe(
(e) => {
console.log('yay, it worked!');
console.log(e);
}
);
查看对应的plunkr:https://plnkr.co/edit/vP3xRDXxFanqzLEKd3eo?p=preview.
此外,a proposal in Angular 旨在简化通过模板语法使用 Rx 从 DOM 事件创建可观察对象的方式。